什么是数据分析

根据业务场景,通过对产品底层数据库内各个库、各个表的数据统计,进行业务分析,寻找发生事情的本质原因。

什么是数据库

按照数据结构来组织、存储和管理数据的仓库

什么是数据分析库

根据业务场景、分析目标,对各个数据库的字段进行抽取、关联、聚合为全新的数据表结构,用于数据分析日常工作,保证其完整性、准确性、时效性。

数据分析步骤

  1. 收集问题

  2. 整理数据

  3. 提出假设

  4. 验证假设

  5. 找出问题

  6. 提出方案

    提出假设-验证问题-找出问题 这一步骤或许需要重复N次,直到趋向于真相水落石出。

步骤1.收集问题

根据日常产品运营中,对于产品不满意的地方,可内部发起、也可以通过用户反馈、市场反馈以及竞品分析来寻找并收集问题。

步骤2.整理数据

  • 熟悉产品底层架构,数据库表结构,根据问题来确定分析目标
  • 确定分析时需要的数据库表以及相应重要字段
  • 确定分析时需要的数据维度和数据质量
  • 将各个数据库表内重要分析字段聚合在数据分析库中
  • 将数据分析库中每条数据重要字段进行检查其完整性、异常性,保证数据准确、完整。

步骤3.提出假设

根据经验判断问题的原因,可假设多个原因,并对各个原因分析需要的数据字段、维度进行整理。

步骤4.验证假设

  • 根据提出的假设,对应建立多个数据分析模型
  • 将数据分析库中每条数据各跑一遍分析模型
  • 得出多个数据分析模型的结果
  • 根据提出的假设,分析结果内容

步骤5.找出问题

根据分析结果内容,对标假设,寻找出问题原因,有时会有多个,再根据优先级/重要程度进行排序,得出事情根本问题

步骤6.提出方案

将数据分析结果与运营部门进行沟通,制定解决方案

Python 聚合数据

以下代码通过对用户表、充值表、消费表进行聚合并创建新的数据分析表,使用PyMongo高级聚合方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 实例化用户表
user = connection_db.get_user()
# 实例化充值表
recharge = connection_db.get_recharge()
# 实例化消费表
consume = connection_db.get_consume()
# 链接数据库
client = MongoClient('localhost', 27017)
# 实例化统计表
db_statistical = client.statistical
statistical = db_statistical.statistical
# lookup 关联表匹配uid
lookup_recharge = {'$lookup': {
'from': 'recharge',
'localField': '_id',
'foreignField': 'uid',
'as': 'recharge'
}}
lookup_consume = {'$lookup': {
'from': 'consume',
'localField': '_id',
'foreignField': 'uid',
'as': 'consume'
}}

# replaceRoot 提升到顶级并替换所有其他字段
# mergeObjects 将多个文档合并为一个文档
# arrayElemAt 返回指定数组索引处的元素
replaceRoot_recharge = {'$replaceRoot': {'newRoot': {'$mergeObjects': [{'$arrayElemAt': ['$recharge', 0]}, '$$ROOT']}}}
replaceRoot_consume = {'$replaceRoot': {'newRoot': {'$mergeObjects': [{'$arrayElemAt': ['$consume', 0]}, '$$ROOT']}}}


# project 筛选需要保留字段
project = {'$project': {
# 用户
'_id': 1,
'phone': 1,
'nickname': 1,
'regDate': 1,
'lastLogin': 1,
'clastLogin': 1,
'balance': 1,
'jBalance': 1,
'rBalance': 1,
'totalRecharge': 1,
'jcode': 1,
# 消费
'consume.amount': 1,
'consume.consumeDate': 1,
# 充值
'recharge.real': 1,
'recharge.amount': 1,
'recharge.from': 1,
'recharge.rechargeDate': 1,
'recharge.tradeNo': 1,
}}


pipeline = [lookup_recharge, lookup_consume, replaceRoot_recharge, replaceRoot_consume, project]
result = user.aggregate(pipeline)

Python 整理数据

以下代码通过对数据分析表中重要字段进行清洗和修复,使用Python基本循环+判断方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 实例化统计表
user = connection_db.get_statistical()
users = [u for u in user.find({})]
# 实例化订单表
job = connection_db.get_job()
jobs = [j for j in job.find({})]


# 修复最后登录日期错误的文档
def update_last_login():
date = datetime.datetime(1, 1, 1, 0, 0)
for u in users:
if u.get('lastLogin') == date:
print('正在修复最后登录日期...' + u.get('lastLogin') + '-->' + u.get('regDate'))
user.update_many(
{'lastLogin': date},
{'$set': {'lastLogin': u.get('regDate')}}
)
else:
print('没有可修复的文档!')
print('最后登录日期已全部修复!')
return


# 修复任务表内无效文档
def update_error_jobs():
for j in jobs:
if j.get('Status') is None:
print('正在修复任务表错误文档...')
print(j)
job.delete_one(j)
return


start_time = datetime.datetime.now()
update_last_login()
update_error_jobs()
end_time = datetime.datetime.now()

print('修复文档完成,耗时:' + str((end_time-start_time).seconds) + '秒')