前一阵有个字节跳动的程序员火了,年仅28岁实现了财务自由,宣布提前退休。最直接的原因是选择了一家发展前景很好的创业公司。当然平时我们经常能听到,某某人加入创业公司,xx年后公司上市,身价暴涨,财务自由。但这都是小概率事件,大部分人往往要么等不到公司上市就离职,要么公司还没上市就破产。这两天找到一份近几年破产的IT公司名单,共6000家,下面就对这份数据做个简单分析。

分析思路大致如下:

  • 了解整体概况
  • 单维度分析破产的公司
  • 维度交叉分析破产公司

首先导入分析所需的模块

import pandas as pd
import seaborn as sns
import matplotlib.pylab as plt
import numpy as np
# 绘图显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

pandas读取破产公司文件,并预览数据

com_all = pd.read_csv('./data/com.csv')
com_all.head(3)

字段比较多,我们用info来看一下

com_all.info()

共有6272行,也就是6272家公司。共有16列,前10列基本都是非空的,所以下面我们主要对前10列进行分析。

接来下,我们先对数据做个大致了解,先来看看数据涉及哪些年份,以及每年的破产公司数量

# 从日期字符串提取年份子串
com_all['death_year'] = com_all['death_data'].apply(lambda x: x[:4])
# 按年份分组计数,画每年破产公司数量的折线图
com_all[['com_name', 'death_year']].groupby('death_year').count().plot(xticks=range(20), rot=30, figsize=(10, 6))

明显能看到从14年破产公司开始增多,15年陡增,17年达到峰值,所以说17年开始不少自媒体经常说大环境不好也是有原因的。记得我15年刚毕业找工作的时候就听说大环境已经不太好了,然而我17年跳槽的时候环境变得更差了。这真是好事没赶上,坏事没落下。

对整体数据有了大致了解以后,我们按照单维度拆解,分别来对破产公司进行分析。上面提到14年破产公司开始增加,那么我们可以认为14年之前破产的公司属于自然破产,而非所谓的“大环境”导致。所以下面我们只对14年之后的破产公司进行分析。

com_part = com_all[com_all['death_year'] >= '2014']

下面以公司所在地为例,查看不同省份破产公司分布

# 城市
com_city_gb = com_part[['com_name', 'com_addr']].groupby('com_addr').count().sort_values(by='com_name', ascending=False)
com_city_gb[com_city_gb['com_name'] > 10].plot(kind='bar', rot=20, title='省份', figsize=(10, 6))

可以看到北京、广东、上海等经济发达的地区,破产产的公司更多。这里需要注意一个概念叫幸存者偏差,举个例子,你如果从这个数据得出北京、上海等地创业更容易破产的结论,那就是有偏差的。因为你只是从幸存下来的破产数据去下结论,而没有考虑总体数据,因此得到的结论是有偏差的或者说是不对的。举个例子,图上可以看到北京破产的公司有2000家,浙江破产的公司大概400家,而实际上北京同期成立的创业公司可能有3000家,创业死亡率为 67%,而浙江同期成立的创业公司可能有800家,创业死亡率为 50%,明显在北京创业有更高的存活率。

然后我们在分行业维度来看看破产公司分布

# 行业
com_cat_gb = com_part[['com_name', 'cat']].groupby('cat').count().sort_values(by='com_name', ascending=False)
com_cat_gb.plot(kind='bar', rot=20, title='行业', figsize=(10, 6))

可以看到电子商务、企业服务、本地生活、金融等行业破产公司数量较多,这里同样存在幸存者偏差的问题,行业死亡率是否高,还需要结合行业整体数据来判断。

同样的方式,我们在分别看看融资阶段和破产原因两个维度的情况

从破产融资阶段看,破产的公司大部分都没有融资记录或者没有获得融资。如果能拿到所有公司注册和破产的数据,再结合融资阶段画一个不同融资阶段的漏斗图会非常直观看到各个融资阶段的存活率。

从破产原因看,破产的原因主要在于商业模式匮乏、行业竞争以及市场伪需求。

到这里,单维度的数据就分析完了。但单维度分析有个缺点是粒度太粗了,它只能反映整体的情况。如果需要更进一步的细化分析,还需要进行维度交叉。

上面对破产原因单维度进行分析,我们知道了大部分公司是因为什么原因导致的破产,但这反映不出不同行业的破产原因。下面我就选行业破产原因这俩个维度进行更细化的分析。首先的想法是将行业作为x轴,破产原因作为y轴做个散点图,图上的点越大,说明对应的行业的破产原因就越突出

# 选top行业和破产原因
death_reasons = com_death_reason_gb[:15].index.values
cats = com_cat_gb[:10].index.values

com_part2 = com_part[com_part['death_reason'].isin(death_reasons) & com_part['cat'].isin(cats)]

com_part2.plot(kind='scatter', x='cat', y='death_reason', figsize=(10, 6))

行业和破产原因太多了,我们只选top的进行分析。从图上点的大小大概能看出来不同行业的破产原因是不同的,但也不是太直观,并且不能定量地看。

如何更直观地看不同行业下不同破产原因的区别呢,我想到一种方法,计算不同行业、不同破产原因的TGI指标,然后画一个热力图。

TGI反应的是目标群体在总体里的强势或弱势指数。举例:在所有破产公司中,行业竞争原因导致破产的比例是14%,而电商行业里,行业竞争原因导致破产的比例为20%,那么电商行业在行业竞争这个破产原因的TGI=20% / 15% = 1.42。大于1代表在总体里处于强势,数值越高就越强势。

沿着这个思路,准备所需要的数据

# 行业+破产原因维度的破产公司数量
reason_cat_df = com_part2.groupby(['cat', 'death_reason']).count()[['com_name']]

# 行业维度的破产公司数量
cat_df = com_part2.groupby(['cat']).count()[['com_name']]

# 不同破产原因的占比
reason_df = (com_part2.groupby(['death_reason']).count()[['com_name']] / cat_df.sum())

DataFarme索引变为列,方便关联

reason_cat_df.reset_index(inplace=True)
cat_df.reset_index(inplace=True)
reason_df.reset_index(inplace=True)
reason_df.rename(columns={'com_name': 'all_reason_r'}, inplace=True)

按照不同维度,将数据关联在一起,并计算TGI

# 关联数据
tmp_df = pd.merge(reason_cat_df, cat_df, on='cat',how='left')
df = pd.merge(tmp_df, reason_df, on = 'death_reason', how='left')

# 计算每个行业破产原因占比
df['cat_reason_r'] = df['com_name_x'] / df['com_name_y'] 
# 计算每个行业破产原因的TGI
df['cat_reason_tgi'] = df['cat_reason_r'] / df['all_reason_r']

df

这样,TGI就计算完成了。为了画热力图,我们还需要对数据进行重塑,通过透视图行业变成索引,破产原因变成列

df_tgi = df.pivot_table(index='death_reason', columns='cat', values='cat_reason_tgi')
df_tgi = df_tgi.fillna(0)
df_tgi

画热力图

plt.figure(figsize=(15, 8))
sns.heatmap(df_tgi, annot=True, fmt='.2g')

可以放大来看,颜色越浅代表越强势。比如:金融行业在政策监管法律法规风险TGI为7.5,说明这两个原因是导致金融公司破产很强势的原因。

通过TGI+热力图的方式我们可以很直观并且定量的看到不同行业下破产原因的区别。我的分析就到这里了,有兴趣的朋友再对其他维度进行交叉分析。数据地址和源码已经打包,公众号回复关键字破产公司即可。

欢迎公众号 「渡码」 输出别地儿看不到的干货。

Python分析6000家破产IT公司的更多相关文章

  1. Python分析数据难吗?某科技大学教授说,很难但有方法就简单

    用python分析数据难吗?某科技大学的教授这样说,很难,但要讲方法,主要是因为并不是掌握了基础,就能用python来做数据分析的. 所谓python的基础,也就是刚入门的python学习者,学习的基 ...

  2. Python分析离散心率信号(下)

    Python分析离散心率信号(下) 如何使用动态阈值,信号过滤和离群值检测来改善峰值检测. 一些理论和背景 到目前为止,一直在研究如何分析心率信号并从中提取最广泛使用的时域和频域度量.但是,使用的信号 ...

  3. 用Python分析国庆旅游景点,告诉你哪些地方好玩、便宜、人又少

    注:本人参考“裸睡的猪”公众号同名文章,学习使用. 一.目标 使用Python分析出国庆哪些旅游景点:好玩.便宜.人还少的地方,不然拍照都要抢着拍! 二.获取数据 爬取出行网站的旅游景点售票数据,反映 ...

  4. python 分析慢查询日志生成报告

    python分析Mysql慢查询.通过Python调用开源分析工具pt-query-digest生成json结果,Python脚本解析json生成html报告. #!/usr/bin/env pyth ...

  5. Python分析盘点2019全球流行音乐:是哪些歌曲榜单占领了我们?

    写在前面:圣诞刚过,弥留者节日气息的大家是否还在继续学习呐~在匆忙之际也不忘给自己找几首好听的歌曲放松一下,缠绕着音乐一起来看看关于2019年流行音乐趋势是如何用Python分析的吧! 昨天下午没事儿 ...

  6. 五月天的线上演唱会你看了吗?用Python分析网友对这场线上演唱会的看法

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:CDA数据分析师 豆瓣9.4分!这场线上演唱会到底多好看? 首先让我 ...

  7. Python分析离散心率信号(中)

    Python分析离散心率信号(中) 一些理论和背景 心率信号不仅包含有关心脏的信息,还包含有关呼吸,短期血压调节,体温调节和荷尔蒙血压调节(长期)的信息.也(尽管不总是始终如一)与精神努力相关联,这并 ...

  8. Python分析离散心率信号(上)

    Python分析离散心率信号(上) 一些理论和背景 心率包含许多有关信息.如果拥有心率传感器和一些数据,那么当然可以购买分析包或尝试一些可用的开源产品,但是并非所有产品都可以满足需求.也是这种情况.那 ...

  9. 50家硅谷IT公司技术博客

    分享一下 50 家硅谷优秀 IT 公司技术博客,从中可以了解企业文化,技术特色和设计语言,如果直接列出来很单调,加上点评,算吐槽版吧. 知名大厂   1. Facebook https://www.f ...

随机推荐

  1. Python GIL(全局解释器锁)

    理解并发和并行 并行:多个CPU同时执行多个不同的多任务. 就像两个程序(进程),这两个程序是真的在不同的CPU内同时执行多个任务. 并发:CPU切换处理不同的多任务, 还是有两个程序,但只有一个CP ...

  2. day30 继承、派生与多态,类中方法和内置函数

    目录 一.多继承出现的问题(mixins机制) 二.派生与方法重用 三.多态 1 什么是多态 2 为什么要有多态 3 python中多态的鸭子类型 四.绑定方法与非绑定方法 1 绑定方法 1.1对象的 ...

  3. day09 基本数据类型(中)

    目录 一 列表(list) 1.作用 2.定义 3.类型转化 4.内置方法 4.1按索引取值 4.2切片 4.3长度 4.4成员运算 4.5往列表中加值 4.5.1追加 4.5.2追加列表 4.5.3 ...

  4. 电商项目app开发

    购物app的开发 首先我们本次要写的是一个电商的项目,项目主要功能有登录.注册.商品展示.轮播图.加入购物车.购物车管理.支付管理.地址管理.个人信息的修改.商品的分类展示.微信支付等等.主要使用vu ...

  5. 数据可视化之PowerQuery篇(十一)使用Power BI进行动态帕累托分析

    https://zhuanlan.zhihu.com/p/57763423 上篇文章介绍了帕累托图的用处以及如何制作一个简单的帕累托图,在 PowerBI 中可以很方便的生成,但若仅止于此,并不足以体 ...

  6. tensorflow实现lstm中遇到的函数记录

    函数一:initializer=tf.random_uniform_initializer(-0.1, 0.1, seed=123) tf.random_uniform_initializer 参数: ...

  7. 5分钟带你快速入门和了解 OAM Kubernetes

    什么是 OAM? OAM 的全称为开放应用模型(Open Application Model),由阿里巴巴宣布联合微软共同推出. OAM 解决了什么问题? OAM 本质是为了解耦K8S中现存的形形色色 ...

  8. ASP.Net Core 3.1 With Autofac ConfigureServices returning an System.IServiceProvider isn't supported.

    ASP.Net Core 3.1 With Autofac ConfigureServices returning an System.IServiceProvider isn't supported ...

  9. 题解 CF1359A 【Berland Poker】

    题意 给出 \(n,m,k\) ,表示 \(k\) 名玩家打牌,共 \(n\) 张牌,\(m\) 张王,保证 \(k|n\) ,记得分为 拿到最多王的玩家手中王数 \(-\)拿到第二多王的玩家手中的王 ...

  10. antd4 源码学习 :表单

    Evernote Export 首先.vue 的数据流是双向的,而 react 的数据流是单向的. 这意味着什么? 这意味着,vue 中,子组件可以用 emit 把数据更新传给父组件.而 react ...