我是如何摸到运营大门的门把手的?
我是如何摸到运营大门的门把手的?
在这一年里,说实话我真的走了很多的弯路,好不容易才搭建了一套属于自己的方法论,在这里就总结下,同时也给自己复盘。
演讲能力
第一件让我很头疼的的事情,就是演讲能力。我刚开始的第一个任务,就是给下面一层运营的同事介绍我们的产品,然后再让运营传达给用户使用。很没自信,再加上我对产品的不熟悉,导致我第一次讲课的时候就翻车,被下面的同事问得哑口无言。
后来我意识到,主要原因是,我只是把产品说明书原封不动的念给同事听而已,并没有深入的去理解并深挖这个功能是怎么样的,如何说得更简单。然后,我就总结了一套属于自己的演讲流程。
首先给运营培训,要理解你的观众,到底是想要什么假如说讲一套电商的平台,运营肯定会按照用户的思路来问你,总结起来通常就是三个流程:
- 这个产品,可以给我带来什么?
- 哦,长什么样子的?
- 如何可以获得这个东西?
所以说,介绍产品的 PPT 就必须做成上面那个样子:好处是什么 - 长什么样子 - 怎么获得。
后面建议附上一个 FAQ ,解决掉大部分的疑问。(通常 FAQ 在进行小流量测试的时候可以收集几个用户的建议,特别是那种第一次用的小白,你可以好好的调研他们,这样你就能马上提出优化需求对你的产品做出调整)
如果有听众,一定要多眼神交流。
多运用眼神交流述职能力
实际上述职能力也是一个经常被人忽略的一个点,其实述职的好与坏,对运营的职业生涯有着很大的影响,可能述职讲得比较好,你就能够撬动你的领导,获得海量资源更好的做好运营。
当然,还有一个重点就是,复盘。
其实每一次述职,都是一次很好的复盘机会,你可以让你老板知道你现在处于什么阶段,同时给出你下一步的建议。
通常来说,述职的 PPT 有以下几个点:
- 上期的数据和你这个月运营的数据对比
- 指出数据下降的原因和数据上涨的方法
- 数据上涨的方法总结成阶段性 SOP 成为日后的运营手段之一
- 数据下降想出解决方法
- 如何落地和需要准备什么事情
只要每周这样重新复盘一次,根据数据快速调整,那很快就可以找到主要原因并且解决问题。
数据分析
对于运营来说,数据分析是必不可少的一样东西,你可以根据你的数据,来预测你下一步要做什么,你的这一步走的有没有用。这里推荐下秦路的七周数据分析师课程哈。
其实掌握工具是最有用的,不多,掌握 Excel | SQL | Python 这三个玩意就好了。
重点提醒,工具的使用只是辅助,为什么要这个数据的逻辑才是最重要的。最好就是先熟悉业务,再想自己到底要什么数据。
首先就是就是 Excel 的一些常用的 API 了,下面我就给一个常用列表:
# 常用文本清洗
=LEFT(位置,长度)
=RIGHT(位置,长度)
=FIND("你要找的东西",位置,长度)
=CONCATENATE(位置,"要拼接的字符串")
=REPLACE(位置,从哪个字符串开始替换,到哪个字符串结束替换,"要变成一个什么字符")
=SUBSTITUTE(要替换字符的位置,替换的字符,"替换的内容")
=TRIM(要去除空格的位置)
=LEN(查看有字符长度的位置)
# 常用匹配函数
=VLOOKUP(查找值,区域匹配,返回列,精确或者模糊匹配)
=INDEX(索引区域,第几行,第几列)
=MATCH(匹配值,匹配区域,精确或者模糊匹配)
# 常用逻辑运算函数
=IF(位置>你要的值,"为真","为假")
# 还可以嵌套 IF
=IF(位置>你要的值,=IF(位置>你要的值,"为真","为假"),"为假")
# 计算函数
=SUMPRODUCT(要乘的值的区域,系数区域) #相乘后,求和
=COUNT(你要知道有多少个数的区域)
=MAX(你要知道区域的最大值)
=MIN(你要知道区域的最小值)
=RANK(位置,你要知道排名的区域)
=AVERAGE(区域平均值)
=STDEV(区域标准差)
=INT(取整)
=ROUND(位置,取整范围)
=COUNTIF(你要知道值筛选条件的区域(计数),你的条件)
=SUMIF(你要知道值筛选条件的区域(求和),你的条件)
=AVERAGEIF(你要知道值筛选条件的区域(平均数),你的条件)
# 时间换算函数
=YEAR(位置)
=MOUTH(位置)
=DAY(位置)
=WEEKDAY(位置,你要的参数) #参数建议用 2 星期一才等于 1
=NOW()
=TODAY()
最后的最后,还有一个数据透视表,没了,Excel 会这些绝对够用。
其次就是一些比较简单的 SQL 了。
SQL 的话建议直接安装 MySQL,比较简单。接下来给大家讲一些比较简单的语法。
SELECT * FROM data.dataanalyst; -- 这里的 * 号值的是全部匹配,实际上可以换成你想要的字段名字。data 是指主表,dataanalyst 是指主表叫 dataanalyst 的 sheet。
SELECT * FROM data.dataanalyst
limit 10; -- 指的是只要前10行的数据
SELECT * FROM data.dataanalyst
order by userId; -- 把 userId 进行升序
SELECT * FROM data.dataanalyst
order by userId desc; -- 把 userId 进行降序
SELECT * FROM data.dataanalyst
where city = "广州"; -- 把 city 为广州的数据找出来
SELECT * FROM data.dataanalyst
where userId > 1000; -- 把 userId 大于 1000 的数据找出来
SELECT * FROM data.dataanalyst
where userId < 1000; -- 把 userId 小于 1000 的数据找出来
SELECT * FROM data.dataanalyst
where userId between 1000 and 1500; -- 把 userId 在 1000 和 1500 之间的数据找出来
SELECT * FROM data.dataanalyst
where city in ("上海","广州"); -- 把 city 在上海和广州的数据找出来
SELECT * FROM data.dataanalyst
where city != "上海"; -- 把 city 剔除掉上海的数据
SELECT * FROM data.dataanalyst
where city <> "上海"; -- 意思同上
SELECT * FROM data.dataanalyst
where city not in ("上海"); -- 意思同上
SELECT * FROM data.dataanalyst
where city = "上海"
and education = "本科" -- 找到在上海又是本科的数据,后面还能加 and
SELECT * FROM data.dataanalyst
where city = "上海"
or city = "北京" -- 找到在上海或是北京的数据
/* and 和 or 的高级用法,and 和 or 同时出现的时候,and 优先执行,所以可以添加括号*/
SELECT * FROM data.dataanalyst
where
(city = '上海'
and education = '本科')
or
(city = '北京'
and education = '硕士') -- 既满足上海和本科,有满足北京和硕士
SELECT * FROM data.dataanalyst
where
secondType like '%开发%' -- 包含 开发 这两个字的数据
/* 分组神器 group by */
SELECT city,count(positionId) FROM data.dataanalyst
group by city -- 按照 positionId 进行城市岗位计数
SELECT city,count(positionId),count(distinct companyId) FROM data.dataanalyst
group by city -- 按照 positionId 进行城市岗位计数并对公司数量进行计数
SELECT city,education,count(1) FROM data.dataanalyst
group by city,education -- 城市底下不同学历的岗位数量
/* 如何针对分组后的数据进行过滤 */
SELECT city,count(1) FROM data.dataanalyst
group by city
having count(positionId) >= 100 -- id 大于 100 以上的岗位
SELECT city,count(1) FROM data.dataanalyst
where industryField like '%产品运营%'
group by city
having count(positionId) >= 50 -- 所有产品运营岗位大于 50 的城市,having 可以对分组后的数据进行处理
SELECT city FROM data.dataanalyst
group by city
having count(if(industryField like '%产品运营%',1,null)) >= 50 -- 如果是产品运营,就返回 1 到 count 进行计数,如果返回 null 就不计数
SELECT
city,
count(1),
count(if(industryField like '%产品运营%',industryField,null))
count(if(industryField like '%产品运营%',industryField,null)) / count(1)
FROM data.dataanalyst
group by city
having count(if(industryField like '%产品运营%',industryField,null)) >= 10
order by count(if(industryField like '%产品运营%',industryField,null))
-- 会算出一个是城市岗位数量的值,一个是包含 产品运营 的值,并算出占比,还能再进行过滤,并进行降序排列。
SELECT
city,
count(1) as total,
count(if(industryField like '%产品运营%',industryField,null)) as po
count(if(industryField like '%产品运营%',industryField,null)) / count(1)
FROM data.dataanalyst
group by city
having po >= 10
order by po
-- 可以进行赋值
/* SQL 函数 */
SELECT left(salary,locate('k',salary)-1),salary FROM data.dataanalyst
-- 找到第一个 k 的位置并截取,而且把 k 也去掉
SELECT
left(salary,locate('k',salary)-1)
locate('-',salary),
length(salary),
substr(salary,locate('-',salary)+1,length(salary)-locate('-',salary)-1),
salary FROM data.dataanalyst
-- 先找到薪资第一个 k 切片再把 k 去掉,再把 - 的位置截取,取薪资的长度,字符串薪资,起始位置到结束位置切片
/* 子查询,查询也是可以嵌套的 */
SELECT (bottom + top)/2 FROM (
SELECT
left(salary,locate('k',salary)-1) as bottom,
substr(salary,locate('-',salary)+1,lengeh(salary)-locate('-',salary)+1) as top,
salary
FROM data.dataanalyst) as t
-- 对已处理的数据进行查询并求出平均薪资
SELECT
case
when (bottom + top)/2 <= 10 then '0-10'
when (bottom + top)/2 <= 20 then '10-20'
when (bottom + top)/2 <= 30 then '20-30'
else '30+'
end,
salary FROM (
SELECT
left(salary,locate('k',salary)-1) as bottom,
substr(salary,locate('-',salary)+1,lengeh(salary)-locate('-',salary)+1) as top,
salary
FROM data.dataanalyst) as t
-- 对数据进行匹配,类似 vlookup
SELECT * FROM data.dataanalyst
where city in (
SELECT city FROM data.dataanalyst
group by city having count(positionId) >= 100
)
-- 分组完符合规定的城市之后再进行数据查询
/* join 跨表分析,其实有点像 vlookup */
SELECT * FROM data.dataanalyst as d
join data.company as c on d.companyId = c.companyId
-- 根据唯一值 companyId 合并两张表
-- 其实还有各种 join 这里就不一一举例了
SQL JOIN
然后还有 Python 的数据分析,其实不难,只用学 pandas 这个框架就行了。
如果之前一直看我文章的朋友,应该是了解到我对前端还是比较熟悉的,实际上 JavaScript 和 Python 是非常相似的,下面就给大家简单介绍一下 Python 的基础语法。
print()
是一个和 console.log()
一模一样的东西
通常,我们用 JavaScript 打印东西的时候,会用到 console.log()
。
console.log('holy crap')
那用 Python 打印,是用 print()
。
print('holy crap')
我的经验告诉我,print()
这个玩意和 console.log()
一样,是 debug 最好的办法。把觉得有问题的地方都打印一遍。
字符串和数字
'holy crap'
123456
和 JavaScript 一样的逻辑。
变量
JavaScript 有 var
/ const
/ let
现在看起来 Python 可以之间定义,只用赋值就可以了。
people = 'frankietang'
print(people)
也是自上到下运行,重新定义的值会直接覆盖掉。
salary = 3500
salary = 0
print('your salary:' + str(salary))
input()
input()
是一个新玩意。就是可以把你在终端输入的东西给获取出来。类似事件?也不太像。
可以获取到用户输入的东西。
happen = input('What\'s happening?')
print('Suggestions:' + happen)
str()
, int()
, float()
, type()
, len()
字符串同样是要用 \
来转义,或者 ""
test = 'What\'s happening?'
test = "What's happening"
转义字符 | 描述 |
---|---|
(在行尾时) | 续行符 |
\ | 反斜杠符号 |
' | 单引号 |
" | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数yy代表的字符,例如:\o12代表换行 |
\xyy | 十进制数yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
不会直接查,不用记。
type()
就是看属性的,也不用记。
test = '123'
print(type(test)) # <type 'str'>
len()
看长度的。
print(len('123')) # 3
整数是 int()
,没有小数点的那种。
浮点数是 float()
,有小数点的那种。
play = str(int(input('你每天看片的时间?'))*7)
print('您一周玩手机' + play + '小时')
就是可以一直转类型,多少层都可以。
条件语句
就是 if 和 else,还有一个 elif
num = 1
if num < 0 :
print(num + 1)
else :
print(num - 1)
# 0
x = 1
if x > 1:
print ('x > 1')
elif x < 1:
print('x < 1')
else:
print('x = 1')
# 1
布尔值
就是 Ture 和 False
其中Python把 0 、空字符串 '' 和 None 看成 False,其他数值和非空字符串都看成 True 。
“与”“或”“非”三种运算
与运算:只有两个布尔值都为 True 时,计算结果才为 True。
或运算:只要有一个布尔值为 True,计算结果就是 True。
非运算:把True变为False,或者把False变为True。
and 和 or 运算的一条重要法则:短路计算
a = True
print a and 'a = T' or 'a = F'
#输出为“a = T”
- 在计算 a and b 时, a 是 True,则整个计算结果必定取决与 b,因此返回 b。
- 在计算 a or b 时, a 是 True,则根据或运算法则,整个计算结果必定为 True,因此返回 a。
所以 Python 解释器在做布尔运算时,只要能提前确定计算结果,它就不会往后算了,直接返回结果。
whlie
,break
,continue
,exit()
while 是循环,break 是结束,continue 是不再执行下面的语句,回到 while 。
while True:
a1=input('认罪吗?请回答认罪或者不认')
a2=input('认罪吗?请回答认罪或者不认')
if a1 == '认罪' and a2 == '认罪':
print('两人都得判10年,唉')
elif a1 == '不认' and a2 == '认罪':
print('a1判20年,a2判1年,唉')
elif a1 == '认罪' and a2 == '不认':
print('a1判1年,a2判20年')
else:
print('都判3年,太棒了')
break
# 认罪吗?请回答认罪或者不认不认
# 认罪吗?请回答认罪或者不认认罪
# a1判20年,a2判1年,唉
# 认罪吗?请回答认罪或者不认认罪
# 认罪吗?请回答认罪或者不认认罪
# 两人都得判10年,唉
# 认罪吗?请回答认罪或者不认认罪
# 认罪吗?请回答认罪或者不认不认
# a1判1年,a2判20年
# 认罪吗?请回答认罪或者不认不认
# 认罪吗?请回答认罪或者不认不认
# 都判3年,太棒了
exit()
也可以结束循环
a = 0
while True:
a = a + 1
if a == 2:
exit()
print(a)
列表
举个例子
list = [1,2,3,[4,5],6]
print(list[1]) # 2
print(list[3][1]) # 5
print(list[-1]) # 6
print(list[0:4]) # [1, 2, 3, [4, 5]]
print(list[1:3]) # [2, 3]
print(list[1:]) # [2, 3, [4, 5], 6]
print(list[:2]) # [1, 2]
插入数据用 append()
list = [1,2,3,[4,5],6]
list.append(7)
print(list) # [1, 2, 3, [4, 5], 6, 7]
字典
其实就是 key 和 value 的意思。
举个例子,这个是字典包列表
dict = {a:['甲','乙','丙'],b:['A','B','C']}
print(dict[1][0]) # 甲
print(dict[1]) # ['甲','乙','丙']
还有列表包字典
list = [{1:'甲'},{2:'乙'},{3:'丙'}]
print(list[1][2]) # 乙
print(list[1]) # {2: '乙'}
for 循环
和 JavaScript 同理
a = [1,2,3]
for i in a:
print(i) # 123
其实就是等于
a = [1,2,3]
i = a[0] #把列表a里面的第0个数据放到i里面
print(i)
i = a[1] #把列表a里面的第1个数据放到i里面
print(i)
i = a[2] #把列表a里面的第2个数据放到i里面
print(i)
如果要从字典里面取值,用下面这种操作
dict = {'a':1,'b':2,'c':3,'d':4}
for i in dict :
print(i+':'+str(dict[i]))
# a:1
# b:2
# c:3
# d:4
还有一个叫 range()
可以生成整数数列
for i in range(3):
print(i) # 012
for i in range(13,17):
print(i) # 13,14,15,16
for i in range(3):
print('a') # aaa
函数
和 funtion()
同理
def people(name):
print(name+'早上好')
people('邓嘉麟')
return()
也不太难理解,例如下面这个例子,就是返回了一个字符串
def age(i):
if i < 12:
return '是小朋友啊'
elif i < 18:
return '是少年啊'
else:
return '嗯,永远18岁'
n = age(30)
print(n)
这里同样也有作用域这个概念,这里就不多加叙述了。其实可以理解为,外部是公交车,人人可以上,内部是私家车,私人可以上。
try...except...
看一个例子
num = [0,1,2,3]
for x in num:
try:
#尝试执行下列代码
print (6/x)
#使用6除以num中的元素,并输出
except ZeroDivisionError:
#除非发生ZeroDivisionError报错,执行下列代码:
print('0是不能做除数的!')
#打印“0是不能做除数的!”
# 0是不能做除数的!
# 6.0
# 3.0
# 2.0
就是错误后也运行,不过会抛出自己的写的异常。
还有一个 pass,就是直接跳过,执行下一轮循环。
num = [0,1,2,3]
for x in num:
try:
print (6/x)
except :
pass
# 6.0
# 3.0
# 2.0
- except后面什么也不跟,直接加冒号。意味着,只要报错就执行下面的代码,不管是什么错误类型。
- 报错后执行的代码,你也可以只写一个'pass','pass'的意思就是:什么都不做。'pass'的存在意义是占个位,维护格式完整。比如except语句后面要求你要执行点什么报错后的程序,但你又什么都不想执行,那就pass好了。
encode()
, decode()
, ord()
, chr()
decode 的作用是将其他编码的字符串转换成 unicode 编码,如str1.decode('gb2312')
,表示将 gb2312 编码的字符串转换成 unicode 编码。
encode 的作用是将 unicode 编码转换成其他编码的字符串,如str2.encode('gb2312')
,表示将 unicode 编码的字符串转换成 gb2312 编码。
ord()
函数主要用来返回对应字符的 ascii 码,chr()
主要用来表示 ascii 码对应的字符他的输入时数字,可以用十进制,也可以用十六进制。
print('邓嘉麟'.encode('gbk'))
print(b'\xb5\xcb\xbc\xce\xf7\xeb'.decode('gbk'))
print(ord('麟'))
print(chr(40607))
open()
方法
Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
open(file, mode='r')
完整的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 一般使用utf8
- errors: 报错级别
- newline: 区分换行符
- closefd: 传入的file参数类型
- opener:
mode 参数有:
模式 | 描述 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(不推荐)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
默认为文本模式,如果要以二进制模式打开,加上 b 。
file 对象
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:
序号 | 方法及描述 |
---|---|
1 | file.close()关闭文件。关闭后文件不能再进行读写操作。 |
2 | file.flush()刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 | file.fileno()返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 | file.isatty()如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 | file.next()返回文件下一行。 |
6 | [file.read(size])从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 | [file.readline(size])读取整行,包括 "\n" 字符。 |
8 | [file.readlines(sizeint])读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。 |
9 | [file.seek(offset, whence])设置文件当前位置 |
10 | file.tell()返回文件当前位置。 |
11 | [file.truncate(size])截取文件,截取的字节通过size指定,默认为当前文件位置。 |
12 | file.write(str)将字符串写入文件,返回的是写入的字符长度。 |
13 | file.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
举个例子
# -*- coding: UTF-8 -*-
# file1 = open('./abc.txt','r') # 只读
# filecontent = file1.read()
# print(filecontent)
# file1.close()
# file1 = open('./abc.txt','w') # 覆盖
# file1.write('张无忌\n')
# file1.write('宋青书\n')
file1 = open('./abc.txt','a') # 添加
file1.write('张无忌\n')
file1.write('宋青书\n')
file1.close()
abc.txt 就长这个样子
周芷若
赵敏
张无忌
宋青书
split()
和 join()
join()
链接字符串
split()
拆分字符串
test1=['a','b','c']
print('-'.join(test1)) # a-b-c
test2='a b c'
print(test2.split(' ')) # ['a','b','c']
对象
class Food() :
# 定义一个食物的类别
delicious = True
# 属性“好吃”为真
def taste(self,people) :
# 定义一个“品尝”的方法,参数有两个。其中self是系统预设关键词,代表的是这个对象本身,调用该方法时可省略这个参数的填写。
# people是吃食物的人。
print(people,'说:真香!')
# 输出people,'说:真香!'
chaofan = Food()
# 定义一个食物,炒饭
print(type(chaofan))
# 输出食物炒饭的数据类型
print(chaofan.delicious)
# 输出食物炒饭的 delicious 属性
chaofan.taste('Frankie')
# 调用品尝的方法,Frankie 吃掉炒饭
好,以上就是 Python 的基础,是进行 Python 数据分析的根基。
数据分析推进下一步进展
目前在公司,其实主要是负责 B 端用户的运营,专注提升用户对 TO C 的服务能力的,所以我每天都会在看每个品牌下面有什么大区,大区下面有什么门店,哪个用户比较突出,哪个用户数据不行,通常来说,我都是会直接面对面接触用户看看他们在干什么,如果他们做了哪些比较优秀的点,我就会收集起来制定一套方案,并且执行落地。
以上就是我这快一年来的运营回顾,可提升的事情还有很多,仍需努力呢。