用Python分析14425条死亡公司数据 看十年创业公司消亡史
一、前言
IT桔子有一个新经济死亡公司数据库:https://www.itjuzi.com/deathCompany,统计了2000-2020年之间比较出名的公司 “死亡” 数据,数据来源真实可靠。
- “死亡公司数据库” 的公司关闭时间是依据公开媒体报道及部分估算,可能会存在些许误差,但还是具有较高的可靠性;
- IT桔子对所收录公司运营状况的判定来源如下:1、公开媒体报道公司关闭、破产清算的;2、公司自身在微信、微博等渠道宣布关闭、破产清算的;3、公司明显经营异常:公司被注销;公司产品比如APP或微信持续 6 个月及以上没更新;公司因为监管被抓、无法经营……交叉比对后确认没有持续经营。
二、数据预处理
对已获取的 14425 条死亡公司数据进行数据查看和预处理
import pandas as pd df = pd.read_excel('倒闭公司数据.xlsx') df.head()
df.info() # 查看公司描述为NAN的这一行 df[df.isnull().values == True]
挑选最近十年(2010-2019)的死亡公司数据,来看一看这十年里,创业公司的消亡。
# 提取2010-2019年的死亡公司数据 df1 = df[df['倒闭时间'].str[:4].apply(int) >= 2010] df2 = df1[df1['倒闭时间'].str[:4].apply(int) < 2020] df2.head()
# 2010-2019 的死亡公司数据保存到新的Excel df2.to_excel('2010-2019倒闭公司数据.xlsx', index=False)
三、数据分析
大家常说 1998 年是中国互联网元年,2010年是移动互联网的元年。也难怪,2010年的移动互联网实在是太热闹了。微信、小米、美团、爱奇艺等都在这一年相继成立。百度在谷歌退出中国后成为最大的受益者,淘宝成为阿里新的增长点,腾讯则宣布 QQ 同时在线超 1 亿人。自此,百度、阿里和腾讯正式成为”三巨头”——BAT。除此之外,网易的网游、新浪的微博、搜狐的视频和输入法也开始发力出击,移动互联网的竞争正式拉开帷幕。
pyecharts 绘制折线图可视化:
# -*- coding: UTF-8 -*- """ @Author :叶庭云 @公众号 :修炼Python @CSDN :https://yetingyun.blog.csdn.net/ """ import pandas as pd import pyecharts.options as opts import pyecharts from pyecharts.charts import Line from pyecharts.globals import CurrentConfig, ThemeType print(pyecharts.__version__) # 查看当前 pyecharts 版本 # 引用本地js资源渲染 CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/' # 读取数据 df = pd.read_excel('2010-2019倒闭公司数据.xlsx') df1 = df[(df['成立之年'] >= 2010) & (df['成立之年'] < 2020)] born_time = df1['成立之年'].value_counts() # 按索引 2010-2019排序 born_time = born_time.sort_index() death_time = df['倒闭时间'].str[:4].apply(int).value_counts() death_time = death_time.sort_index() year = [f'{i}年' for i in range(2010, 2020)] num_1 = [int(x) for x in born_time.values] num_2 = [int(y) for y in death_time.values] c = ( Line(init_opts=opts.InitOpts(theme=ThemeType.DARK)) .add_xaxis(xaxis_data=year) .set_colors(['#7FFF00', 'red']) # 设置两条折线图的颜色 .add_yaxis('出生公司数量', y_axis=num_1) .add_yaxis('死亡公司数量', y_axis=num_2) .set_global_opts( # 设置x轴 y轴标签 xaxis_opts=opts.AxisOpts(name='年份'), yaxis_opts=opts.AxisOpts(name='数量') ) .render('test.html') )
2010 年来,历年出生及死亡的公司数量趋势如下图:
- 2014、2015年是公司诞生潮,两年后,正好对应了2016、2017的一波死亡潮。在 2017 年和 2018 年,均超过 2000 家公司倒闭,2019年超过 5000 家公司倒闭。2015年以后,新生创业公司越来越少,也侧面反应了创业越来越艰难。
- 在这十年间,诸多 “风口” 起起伏伏。网约车、团购、直播、基因检测、共享单车、短视频、比特币、VR|AR、无人货架、人工智能、直播带货……
每一个风口上,都站着数百头 “猪”,尝试飞起来。下面看看各行业这十年来倒闭公司数量分布情况。
# -*- coding: UTF-8 -*- """ @Author :叶庭云 @公众号 :修炼Python @CSDN :https://yetingyun.blog.csdn.net/ """ import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import seaborn as sns # 读取数据 df = pd.read_excel('2010-2019倒闭公司数据.xlsx') df['倒闭之年'] = df['倒闭时间'].str[:4].apply(int) # unique() 获取所属行业这一列的唯一值 去重 datas = list(df['所属行业'].unique()) print(datas) # print(len(datas)) for item in datas: # 判断每行 有这个类型 对应类型的列下添个1 df[item] = df['所属行业'].str.contains(item).apply(lambda x: 1 if x else 0) industry_data = df.loc[:, datas] # 将成立之年作为索引标签 industry_data.index = df['倒闭之年'] # 将数据集按年份分组并求和,得出每个年份,公司所属各行业的数量 industry_df = industry_data.groupby('倒闭之年').sum() # print(industry_df) # print(type(industry_df)) # industry_df.to_excel('2010-2019年各行业倒闭公司数量.xlsx', encoding='gbk') mpl.rcParams['font.family'] = 'Kaiti' fig, ax = plt.subplots(figsize=(15, 9)) # 绘制热力图 cmap:从数字到色彩空间的映射 # PRGn_r OrRd rainbow sns.heatmap(data=industry_df.T, linewidths=0.25, linecolor='white', ax=ax, annot=True, fmt='d', cmap='rainbow', robust=True, ) # 添加描述信息 x y轴 title ax.set_xlabel('年份', fontdict={'size': 18, 'weight': 'bold'}) ax.set_ylabel('公司所属行业', fontdict={'size': 18, 'weight': 'bold'}) ax.set_title('2010-2019年各行业倒闭公司数量热力图', fontsize=25, x=0.5, y=1.02) # 隐藏边框 ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['left'].set_visible(False) ax.spines['bottom'].set_visible(False) # 保存 展示图片 plt.savefig('heat_map.png') plt.show()
# -*- coding: UTF-8 -*- """ @Author :叶庭云 @公众号 :修炼Python @CSDN :https://yetingyun.blog.csdn.net/ """ import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import mplcyberpunk # 读取数据 df = pd.read_excel('2010-2019倒闭公司数据.xlsx') df['倒闭之年'] = df['倒闭时间'].str[:4].apply(int) # unique() 获取所属行业这一列的唯一值 去重 datas = list(df['所属行业'].unique()) print(datas) # print(len(datas)) for item in datas: # 判断每行 有这个类型 对应类型的列下添个1 df[item] = df['所属行业'].str.contains(item).apply(lambda x: 1 if x else 0) industry_data = df.loc[:, datas] # 将成立之年作为索引标签 industry_data.index = df['倒闭之年'] # 将数据集按年份分组并求和,得出每个年份,公司所属各行业的数量 industry_df = industry_data.groupby('倒闭之年').sum() # print(industry_df) # print(type(industry_df)) industry_df.T.to_excel('2010-2019年各行业倒闭公司数量.xlsx', encoding='gbk') # 使用风格样式 赛博朋克风格 plt.style.use("cyberpunk") # 设置中文显示 mpl.rcParams['font.family'] = 'SimHei' # 设置大小 像素 plt.figure(figsize=(10, 6), dpi=100) # DataFrame 绘制折线图 plt.plot(industry_df, label=industry_df.columns) # 添加描述信息 plt.xticks(range(2010, 2020, 1)) plt.xlabel('年份', fontsize=12) plt.ylabel('倒闭公司数量', fontsize=12) plt.title('2010-2019年各行业倒闭公司数量变化趋势', fontsize=18, x=0.5, y=1.02) # 设置线条发光+面积图 mplcyberpunk.add_glow_effects() # 显示图例 plt.legend(industry_df) # 保存图片 plt.savefig('test_004.png') # 展示图片 plt.show()
- 这十年来,各行业倒闭公司数量变化趋势大致相似。在2019年,从公司所处行业来看,倒闭最多的是电子商务,有 675 家;其次是企业服务,有 665 家;第三是金融,有 624 家;本地生活排第四,有 446 家。
- 百团大战、垂直电商大战、外卖大战、打车大战、单车大战,在这些著名的战场里,各种桥段令吃瓜群众们目不暇接。有老大老二打架,老三打没了;有老二老三合并,继续和老大抗衡的;也有老大老二合并,将其他家远远甩在后面的……
- 还有像冲顶大会之类直播答题一样,办起来的时候,各家分庭抗礼来势汹汹,却从2018年的公历新年开始,没有挺到农历新年。
风口消亡的背后,是无数创业公司烧掉的钱,每个公司在一开始,都坚信可以烧倒对手,但烧着烧着把自己烧光了,却再也拿不到融资。
安邦保险、广信房产这两家属于金融行业的公司,在烧钱榜上融资总额分别排第一、第二。共享单车们也曾大战一场,战火烧过国内的各大城市,甚至烧到了海外。摩拜单车在烧钱榜单名列第三,融资总额 327.1596 亿元;ofo小黄车紧随其后,排名第五,融资总额 167.96 亿元,摩拜单车存活 5 年 11 个月,ofo小黄车存活 5 年 7 个月。
接着来看看这些倒闭公司的获投状态
import pandas as pd from collections import Counter # 读取数据 df = pd.read_excel('2010-2019倒闭公司数据.xlsx') data = list(df['获投状态']) count = Counter(data).most_common() for item in count: print(item)
结果如下:
# (获投状态,倒闭公司数量) ('尚未获投', 5184) ('不明确', 4859) ('天使轮', 1898) ('A轮', 622) ('种子轮', 198) ('已被收购', 149) ('A+轮', 137) ('B轮', 117) ('Pre-A轮', 111) ('战略投资', 44) ('C轮', 25) ('D轮', 10) ('B+轮', 9) ('新三板', 5) ('E轮', 2) ('已退市', 2) ('C+轮', 1) ('已上市', 1) ('Pre-B轮', 1)
超过 10000 家倒闭公司获投状态为尚未获投、不明确。
创业公司的消亡,究其原因必然是多方面的,除行业竞争激烈这一核心因素外,最主要的还是资金问题。创业者内在对于如何维稳、如何盈利等方面欠缺的了解、思考与准备,不足以在行业稳定后,支撑他在风口来临之初的一腔热血豪情。
参考 IT 桔子给的市场定位,分析创业公司死亡原因。
# -*- coding: UTF-8 -*- """ @Author :叶庭云 @公众号 :修炼Python @CSDN :https://yetingyun.blog.csdn.net/ """ import pandas as pd from collections import Counter from pyecharts import options as opts from pyecharts.charts import Pie from pyecharts.globals import CurrentConfig CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/' # 读取数据 df = pd.read_excel('2010-2019倒闭公司数据.xlsx') datas = df['倒闭原因'] # 参考IT桔子给的市场定位 创业公司死亡原因主要的问题 reason_loaction = {'团队问题': ['创始人问题', '与投资人冲突', '团队能力不足', '团队缺乏激情'], '产品问题': ['产品缺陷严重', '产品入场时机'], '资金问题': ['烧钱', '现金流断裂', '融资能力不足'], '运营问题': ['定价/成本问题', '营销不足', '不重视客户', '转型问题'], '外部原因': ['法律法规风险', '行业竞争', '政策监管'], '其他问题': ['市场伪需求', '商业模式匮乏', '业务过于分散', '业务调整'] } reasons_list = [] for item in datas: data = item.split('|') for i in data: reasons_list.append(i) reasons_count = Counter(reasons_list).most_common() for item in reasons_count: print(item) print(len(reasons_count)) # 主要有20种原因 result = [] for key in reason_loaction.keys(): num = 0 for i, j in reasons_count: if i in reason_loaction[key]: num += j result.append([key, num]) print(result) c = ( # 宽 高 背景颜色 Pie(init_opts=opts.InitOpts(width="800px", height="500px", bg_color="#2c343c")) .add( series_name="倒闭原因", # 系列名称 data_pair=result, # 系列数据项,格式为 [(key1, value1), (key2, value2)...] rosetype="radius", # radius:扇区圆心角展现数据的百分比,半径展现数据的大小 radius="55%", # 饼图的半径 center=["50%", "50%"], # 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标 label_opts=opts.LabelOpts(is_show=False, position="center"), # 标签配置项 ) .set_colors(["#00BFFF", "#00FF7F", "#FF1493", "#8B008B", "#FFFF00", "#556B2F"]) .set_global_opts( title_opts=opts.TitleOpts( title="Customized Pie", pos_left="center", pos_top="20", title_textstyle_opts=opts.TextStyleOpts(color="#fff"), ), legend_opts=opts.LegendOpts(is_show=False), ) .set_series_opts( tooltip_opts=opts.TooltipOpts( trigger="item", formatter="{a}
{b}: {c} ({d}%)" # 'item': 数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用 ), label_opts=opts.LabelOpts(color="#fff"), ) .render("customized_pie.html") )
结果如下:
('行业竞争', 6818) ('烧钱', 4963) ('融资能力不足', 4655) ('营销不足', 2297) ('现金流断裂', 1802) ('商业模式匮乏', 1490) ('政策监管', 992) ('业务过于分散', 990) ('产品入场时机', 917) ('法律法规风险', 850) ('市场伪需求', 775) ('定价/成本问题', 549) ('业务调整', 150) ('不重视客户', 101) ('产品缺陷严重', 46) ('转型问题', 42) ('团队能力不足', 42) ('创始人问题', 19) ('与投资人冲突', 6) ('团队缺乏激情', 5) 20 [['团队问题', 72], ['产品问题', 963], ['资金问题', 11420], ['运营问题', 2989], ['外部原因', 8660], ['其他问题', 3405]]
- 行业竞争激烈是核心原因。而从市场定位来看,对于创业公司,资金问题是主要原因,包括烧钱、现金流断裂、融资能力不足,其次是外部原因,包括行业竞争激烈、政策监管、法律法规风险。
- 另外,”伪风口” 与 “伪需求” 也曾迷住众多创业公司的眼。有的瞄准的市场过于分散,还未形成市场效应;有的则没有解决市场痛点,不痛不痒的创造用户不需要的需求。”共享经济” 衍生出的共享单车、共享充电宝红红火火,但共享电话、共享厕纸、共享篮球什么的,倒也不必。
比较有意思的是,这个死亡公司数据库还加了一个上香排行榜,排行第一的果然是大名鼎鼎的“快播”。
还真是有的公司死了,但在人们心里它还活着。
再来看一下创业公司的地区分布
# -*- coding: UTF-8 -*- """ @Author :叶庭云 @公众号 :修炼Python @CSDN :https://yetingyun.blog.csdn.net/ """ import pandas as pd from collections import Counter from pyecharts.globals import ThemeType, CurrentConfig, GeoType from pyecharts import options as opts from pyecharts.charts import Geo CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/' # 读取数据 df = pd.read_excel('2010-2019倒闭公司数据.xlsx') # 有些数据可能多了空格 area = list(df['所在地区'].str.strip()) area_count = Counter(area).most_common() # 滤除 filter_area = [('北美洲', 23), ('亚洲', 11), ('欧洲', 3)] area_counts = [item for item in area_count if item not in filter_area] for item in area_counts: print(item) geo = Geo(init_opts=opts.InitOpts(width='1000px', height='600px', theme=ThemeType.DARK)) geo.add_schema(maptype='china', label_opts=opts.LabelOpts(is_show=True)) # 显示label 省名 geo.add('倒闭公司数量', data_pair=area_counts, type_=GeoType.EFFECT_SCATTER, symbol_size=8) geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) geo.set_global_opts(title_opts=opts.TitleOpts(title='倒闭公司数量在全国的分布'), visualmap_opts=opts.VisualMapOpts(max_=5000, is_piecewise=True, pieces=[{"max": 50, "min": 0, "label": "0-50", "color": "#708090"}, # 分段 添加图例注释 和颜色 {"max": 100, "min": 51, "label": "51-100", "color": "#00FFFF"}, {"max": 200, "min": 101, "label": "101-200", "color": "#00008B"}, {"max": 300, "min": 201, "label": "201-300", "color": "#483D8B"}, {"max": 1000, "min": 500, "label": "500-1000", "color": "#1E90FF"}, {"max": 2000, "min": 1001, "label": "1001-2000", "color": "#8B008B"}, {"max": 4000, "min": 2001, "label": "2001-4000", "color": "#FF1493"}, {"max": 5000, "min": 4001, "label": "4001-5000", "color": "#FF0000"} ]) ) geo.render("geo_map.html")
有个别数据地区是北美洲、亚洲、欧洲这样的,不便于分析,将其滤掉。
结果如下:
# (地区,倒闭公司数量) ('北京', 4527) ('广东', 2355) ('上海', 2000) ('浙江', 1007) ('四川', 707) ('江苏', 507) ('湖北', 302) ('福建', 264) ('山东', 211) ('陕西', 197) ('湖南', 155) ('重庆', 154) ('河南', 125) ('安徽', 119) ('天津', 110) ('辽宁', 98) ('河北', 76) ('江西', 62) ('黑龙江', 53) ('广西', 42) ('山西', 36) ('台湾', 36) ('云南', 34) ('贵州', 32) ('海南', 26) ('香港', 23) ('吉林', 20) ('内蒙古', 19) ('新疆', 16) ('甘肃', 11) ('宁夏', 7) ('西藏', 5) ('青海', 2)
北上广不相信眼泪,但创业公司还是青睐于北京、广东、上海等地区。
最后看一下倒闭公司经营年限分布情况
# -*- coding: UTF-8 -*- """ @Author :叶庭云 @公众号 :修炼Python @CSDN :https://yetingyun.blog.csdn.net/ """ import pandas as pd from collections import Counter from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.globals import ThemeType, CurrentConfig CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/' # 读取数据 df = pd.read_excel('2010-2019倒闭公司数据.xlsx') year = list(df['经营年限']) year_count = Counter(year).most_common() year_count = sorted(year_count, key=lambda x:x[0]) x_data = [x[0] for x in year_count] y_data = [y[1] for y in year_count] bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK)) bar.add_xaxis(xaxis_data=x_data) bar.add_yaxis("倒闭公司数量", y_axis=y_data) bar.set_global_opts( title_opts=opts.TitleOpts(title='倒闭公司经营年限分布'), xaxis_opts=opts.AxisOpts(name='经营年限'), # 设置x名称和Label yaxis_opts=opts.AxisOpts(name='倒闭公司数量'), ) bar.render('bar.html')
结果如下:
经营年限不足 1 年的公司有 277 家,倒闭公司经营年限大部分在 2-4 年,经营年限为1年、5年的也比较多,经营年限 6 年以上的越来越少。
经营年限最长的倒闭公司Top10:
import pandas as pd # 读取数据 df = pd.read_excel('2010-2019倒闭公司数据.xlsx') # 按经营年限 降序排列 df1 = df.sort_values(by='经营年限', ascending=False) df1.iloc[:10, ].to_excel('经营年限最长的倒闭公司Top10.xlsx', index=False)
结语:这是一个最好的时代,也是一个最坏的时代,一批创业者正踏上天堂之路,一批创业者正走向地狱之门,创业的道路上致使失败的原因太多,如同蝴蝶效应一样,一个小小的问题,也可能导致最终的失败。创业不易,且行且珍惜!