首页 > 百科知识 >

同比与环比是什么意思( 同比和环比分析)

100次浏览     发布时间:2025-03-30 04:46:28    

我们了解到数据分析的重要作用、数据分析的定义以及数据分析流程,建立数据分析的基础知识体系;进而从数据分析知识体系及实践(二)中,我们介绍了进行数据分析的角色——数据工程师、数据科学家和机器学习工程师等的职责区别,以及要进行数据分析必备的技术技能和通用技能,构建数据分析的技能知识体系。本章我们继续介绍数据分析的常用数据模型。从数据分析知识体系及实践(三)中,我们介绍了经典的、常用的数据模型,模型的作用是将大量复杂的数据,转换为易于理解和操作的洞察。本章我们基于一个实践,对前面的知识进行应用示例。

同比和环比分析(基于Python的数据分析实践)

场景介绍

XX是一款中英阅读 app,迄今已上线 3 年多。为调研该 app 的使用情况,需要统计 2021 年来,月活跃用户的 同比环比 变化情况,并找出哪些月份的月活有同比或环比下降。

需求分析

同比增长 = (本期/去年同期 - 1) × 100%

环比增长 = (本期/上期 - 1) × 100%

实操分析

Pandas类库

Pandas 是基于 Python 的数据分析工具,适合处理与 SQL 或 Excel 表类似的二维数据,它就像一把瑞士军刀,广泛地运用于金融、统计、社会科学、工程等领域里的各种场景。

安装方法:pip install pandas -i
https://pypi.tuna.tsinghua.edu.cn/simple

文件地址:/月活数据.csv

Step 1 读取数据

import pandas as pd

# 设置展示样式的代码,可以忽略
pd.set_option('display.unicode.east_asian_width', True)

# 代码中的路径是示范,自己在本地运行时要换成你的实际路径
path = "/Users/wenwen/Desktop/data-analysis/月活数据.csv"
df = pd.read_csv(path)
print(df)

'''
输出:
    Unnamed: 0     2020     2021       2022
0            1  1057066  1315871  1600889.0
1            2  1557372  1236012  1715643.0
2            3  1585905  1807039  1884091.0
3            4  1348273  1686054  2072804.0
4            5  1205402  1576076  1628067.0
5            6  1154504  1571498  1544610.0
6            7  1382068  1690782        NaN
7            8  1427213  1722690        NaN
8            9  1611728  1954804        NaN
9           10  1544990  1893907        NaN
10          11  1562527  1876472        NaN
11          12  1381485  1703075        NaN
'''

DataFrame 是 Pandas 的核心数据结构,由数据、列索引与行索引三部分构成。修改行索引名或列索引名,要使用 DataFramerename() 方法,通用格式如下:

df.rename(
  # 修改列索引名的参数
  columns={"旧列名1":"新列名1", "旧列名2":"新列名2", ...}, 
  # 修改行索引名的参数
  index={"旧行名1":"新行名1", "旧行名2":"新行名2", ...} 
)

Pandas 里,绝大多数方法都不改变原始的输入数据,而是生成新的对象。修改前的 DataFrame 我们已经不需要了,直接用修改后的新 DataFrame 代替原有数据,传给变量 df 就可以。

df = df.rename(columns={'Unnamed: 0':'月份'})
print(df)
'''
输出:
    月份     2020     2021       2022
0      1  1057066  1315871  1600889.0
1      2  1557372  1236012  1715643.0
2      3  1585905  1807039  1884091.0
...
10    11  1562527  1876472        NaN
11    12  1381485  1703075        NaN
'''

将月份作为行索引,更易于理解。将某一列提取出来作为行索引也有专门的方法:set_index(),括号中填入列名就可以。

df = df.set_index('月份')
print(df)
'''
输出:
         2020     2021       2022
月份                             
1     1057066  1315871  1600889.0
2     1557372  1236012  1715643.0
3     1585905  1807039  1884091.0
...
11    1562527  1876472        NaN
12    1381485  1703075        NaN
'''

Step 2 数据的选取

查看其中的特定数据:列的选取,使用 df['列名'] 的格式,多个列则df[['列名1', '列名2', ...]]

print(df['2021'])
'''
输出:
月份
1     1315871
2     1236012
3     1807039
...
11    1876472
12    1703075
Name: 2021, dtype: int64
'''

选取特定行:用到 DataFrameloc 方法,格式为 df.loc['行名']。选择多行df[['行名1', '行名2', ...]]

# 单行选取,查看二月的数据
print(df.loc[2])
'''
输出:
2020    1557372.0
2021    1236012.0
2022    1715643.0
Name: 2, dtype: float64
'''

行列同时选取:

  • 多行多列选取,则会返回 DataFrame
  • 多行单列或单行多列选取,返回 Series
  • 单行单列选取,返回的就是单个值。
# 选取 2021 和 2022 年的第二季度数据(多行多列选取)
print(df.loc[[4, 5, 6], ['2021', '2022']])
'''
输出:
         2021       2022
月份                    
4     1686054  2072804.0
5     1576076  1628067.0
6     1571498  1544610.0
'''
# 选取 2021 年 3 月与 7 月的数据(多行单列)
print(df.loc[[3, 7], '2021'])
'''
输出:
月份
3    1807039
7    1690782
Name: 2021, dtype: int64
'''
# 选取 2021 年 10 月数据(单行单列)
print(df.loc[10, '2021'])
# 输出:1893907

Step 3 列的计算

同比分析

year_on_year = df['2021']/df['2020'] - 1
print(year_on_year)
'''
输出:
月份
1     0.244833
2    -0.206348
3     0.139437
...
11    0.200921
12    0.232786
dtype: float64
'''

将其添加到 df ,作为新增列显示,格式是这样的:df['新列名'] = ...

# 方法一:使用 year_on_year 变量传递值
year_on_year = df['2021']/df['2020'] - 1
df['同比增长'] = year_on_year
# 方法二:直接写进一行
df['同比增长'] = df['2021']/df['2020'] - 1

print(df)
'''
输出:
         2020     2021  同比增长
月份                            
1     1057066  1315871  0.244833
2     1557372  1236012 -0.206348
3     1585905  1807039  0.139437
...
11    1562527  1876472  0.200921
12    1381485  1703075  0.232786
'''

环比分析

对 2021 年每个月份进行环比分析,其实就是求 df['2021'] 这个 Series 中,一个数值与上个数值的相对百分比变化。这个功能,Series 提供了专门的方法:pct_change() ,也就是 percent change 的缩写。我们直接调用,就能得出结果:

df['环比增长'] = df['2021'].pct_change()
print(df)
'''
输出:
         2020     2021  同比增长  环比增长
月份                                      
1     1057066  1315871  0.244833       NaN
2     1557372  1236012 -0.206348 -0.060689
3     1585905  1807039  0.139437  0.461991
...
11    1562527  1876472  0.200921 -0.009206
12    1381485  1703075  0.232786 -0.092406
'''

Step 4 完整代码

import pandas as pd

# 设置展示样式的代码,可以忽略
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)

path = "/Users/wenwen/Desktop/data-analysis/月活数据.csv"
# 读取 csv 文件并转换成 DataFrame
df = pd.read_csv(path)
# 将第一列名 'Unnamed: 0' 改成 '月份'
df = df.rename(columns={'Unnamed: 0':'月份'})
# 将月份列作为行索引
df = df.set_index('月份')
# 只保留 2020 年和 2021 年的数据
df = df[['2020', '2021']]
# 计算同比增长
df['同比增长'] = df['2021']/df['2020'] - 1
# 计算环比增长
df['环比增长'] = df['2021'].pct_change()
df.loc[1, '环比增长'] = df.loc[1, '2021']/df.loc[12, '2020'] - 1

print(df)
'''
输出:
         2020     2021  同比增长  环比增长
月份                                      
1     1057066  1315871  0.244833 -0.047495
2     1557372  1236012 -0.206348 -0.060689
3     1585905  1807039  0.139437  0.461991
...
11    1562527  1876472  0.200921 -0.009206
12    1381485  1703075  0.232786 -0.092406

Step 5 数据筛选

找出同比负增长与环比负增长的月份

year_on_year_down = df.loc[df['同比增长'] < 0, ['2021', '同比增长']]
print(year_on_year_down)
'''
输出:
         2021  同比增长
月份                   
2     1236012 -0.206348
'''

# 选择同比增长数字不小于 0 的行,展示同比增长列
df.loc[df['同比增长']>=0, '同比增长']

# 选择同比增长与环比增长都不小于 0 的行,展示同比增长与环比增长列
df.loc[(df['同比增长']>=0) & (df['环比增长']>=0), ['同比增长', '环比增长']]

# 选择同比增长不小于 0 或环比增长不小于 0 的行,展示同比增长与环比增长列
df.loc[(df['同比增长']>=0) | (df['环比增长']>=0), ['同比增长', '环比增长']]

批量套用函数

def float_to_pct(num):
  pct = round(num * 100, 2)
  pct_string = '{}%'.format(pct)
  return pct_string

print(month_on_month_down['环比增长'].apply(float_to_pct))
'''
输出:
月份
1     -4.75%
2     -6.07%
...
11    -0.92%
12    -9.24%
Name: 环比增长, dtype: object
'''

# 筛选同比负增长的月份
year_on_year_down = df.loc[df['同比增长'] < 0, ['2021', '同比增长']]
# 筛选环比负增长的月份
month_on_month_down = df.loc[df['环比增长'] < 0, ['2021', '环比增长']]

# 定义浮点数转百分数的函数
def float_to_pct(num, n):
  pct = round(num * 100, n)
  pct_string = '{}%'.format(pct)
  return pct_string

# 批量将数字转为百分数
year_on_year_down['同比增长'] = year_on_year_down['同比增长'].apply(float_to_pct, n=2)
month_on_month_down['环比增长'] = month_on_month_down['环比增长'].apply(float_to_pct, n=2)

# 打印结果
print('-----------------------')
print(year_on_year_down)
print('-----------------------')
print(month_on_month_down)
print('-----------------------')

使用专业绘图库 Plotly

from plotly import express
fig = express.line(df[['同比增长', '环比增长']] * 100, x =df.index, y=['同比增长', '环比增长'])
fig.update_traces(mode='lines+markers', line_dash='dot',hovertemplate='%{y:.2f}')
fig.update_traces(line_color='#fda161', selector={'name':'同比增长'})
fig.update_traces(line_color='#3cd3ef',selector={'name':'环比增长'})
fig.update_layout(
  legend_title='',
  xaxis=dict(tickvals=list(range(1, 13)),showgrid=False),
  yaxis=dict(title='增长(%)', showgrid=False, zeroline=True, zerolinecolor='grey', zerolinewidth=0.2),
  )
fig.show()

热门文章

最新文章