我是如何摸到运营大门的门把手的?
在这一年里,说实话我真的走了很多的弯路,好不容易才搭建了一套属于自己的方法论,在这里就总结下,同时也给自己复盘。
演讲能力
第一件让我很头疼的的事情,就是演讲能力。我刚开始的第一个任务,就是给下面一层运营的同事介绍我们的产品,然后再让运营传达给用户使用。很没自信,再加上我对产品的不熟悉,导致我第一次讲课的时候就翻车,被下面的同事问得哑口无言。
后来我意识到,主要原因是,我只是把产品说明书原封不动的念给同事听而已,并没有深入的去理解并深挖这个功能是怎么样的,如何说得更简单。然后,我就总结了一套属于自己的演讲流程。
首先给运营培训,要理解你的观众,到底是想要什么假如说讲一套电商的平台,运营肯定会按照用户的思路来问你,总结起来通常就是三个流程:
- 这个产品,可以给我带来什么?
- 哦,长什么样子的?
- 如何可以获得这个东西?
所以说,介绍产品的 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 的服务能力的,所以我每天都会在看每个品牌下面有什么大区,大区下面有什么门店,哪个用户比较突出,哪个用户数据不行,通常来说,我都是会直接面对面接触用户看看他们在干什么,如果他们做了哪些比较优秀的点,我就会收集起来制定一套方案,并且执行落地。
以上就是我这快一年来的运营回顾,可提升的事情还有很多,仍需努力呢。












网友评论