电信用户流失预测模型

1、研究背景

1、做好“用户流失预测”可以降低营销成本。老生常谈,“新客户开发成本”是“老客户维护成本”的5倍。
2、获得更好的用户体验。并不是所有的增值服务都可以有效留住客户。
3、获得更高的销售回报。价格敏感型客户和非价格敏感性客户

2、提出问题

1、流失客户有哪些显著性特征?
2、当客户在哪些特征下什么条件下比较容易发生流失

3、数据集描述

用户属性
customerID :用户ID。
gender:性别。(Female & Male)
SeniorCitizen :老年人 (1表示是,0表示不是)
Partner :是否有配偶 (Yes or No)
Dependents :是否经济独立 (Yes or No)
tenure :客户的职位(0-72,共73个职位)
用户行为
PhoneService :是否开通电话服务业务 (Yes or No)
MultipleLines:是否开通了多线业务(Yes 、No or No phoneservice 三种)
InternetService:是否开通互联网服务 (No, DSL数字网络,fiber optic光纤网络 三种)
OnlineSecurity:是否开通网络安全服务(Yes,No,No internetserive 三种)
OnlineBackup:是否开通在线备份业务(Yes,No,No internetserive 三种)
DeviceProtection:是否开通了设备保护业务(Yes,No,No internetserive 三种)
TechSupport:是否开通了技术支持服务(Yes,No,No internetserive 三种)
StreamingTV:是否开通网络电视(Yes,No,No internetserive 三种)
StreamingMovies:是否开通网络电影(Yes,No,No internetserive 三种)
Contract:签订合同方式 (按月,一年,两年)
PaperlessBilling:是否开通电子账单(Yes or No)
PaymentMethod:付款方式(bank transfer,credit card,electronic check,mailed check)
MonthlyCharges:月费用
TotalCharges:总费用
研究对象
Churn:该用户是否流失(Yes or No)


image.png

数据清洗

6.1、导入模块

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='darkgrid',font_scale=1.3)
plt.rcParams['font.family']='SimHei'
plt.rcParams['axes.unicode_minus']=False
import sklearn
from sklearn import preprocessing                            #数据预处理模块
from sklearn.preprocessing import LabelEncoder               #编码转换
from sklearn.preprocessing import StandardScaler             #归一化
from sklearn.model_selection import StratifiedShuffleSplit   #分层抽样
from sklearn.model_selection import train_test_split         #数据分区
from sklearn.decomposition import PCA                        #主成分分析 (降维)
from sklearn.ensemble import RandomForestClassifier     #随机森林
from sklearn.svm import SVC,LinearSVC                   #支持向量机
from sklearn.linear_model import LogisticRegression     #逻辑回归
from sklearn.neighbors import KNeighborsClassifier      #KNN算法
from sklearn.cluster import KMeans                     #K-Means 聚类算法
from sklearn.naive_bayes import GaussianNB              #朴素贝叶斯
from sklearn.tree import DecisionTreeClassifier         #决策树
import xgboost as xgb
from xgboost import XGBClassifier                      
from catboost import CatBoostClassifier                
from sklearn.ensemble import AdaBoostClassifier        
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report,precision_score,recall_score,f1_score  #分类报告
from sklearn.metrics import confusion_matrix           #混淆矩阵
from sklearn.metrics import silhouette_score           #轮廓系数(评价k-mean聚类效果)
from sklearn.model_selection import GridSearchCV       #交叉验证
from sklearn.metrics import make_scorer
from sklearn.ensemble import VotingClassifier          #投票
import warnings
warnings.filterwarnings('ignore')

6.2、读取数据

df = pd.read_csv('WA_Fn-UseC_-Telco-Customer-Churn.csv',header=0)
df.head()
image.png
#查看数据大小
df.shape
image.png
#查看数据数据及分布
df.describe()
image.png

6.3 数据清洗

#查看缺失值
df.isnull().sum()
image.png
#查看数据类型
df.info()
image.png

总费用 TotalCharges 该列的数据类型应是float64,不是object
df['TotalCharges'].astype('float64')
此处用“astype”转化数据类型报错 “could not convert string to float”
改用强制转化 convert_numeric=True

df['TotalCharges']=df['TotalCharges'].convert_objects(convert_numeric=True)
df['TotalCharges'].dtype

TotalCharges列有11个缺失值,处理缺失值的原则是尽量填充,最后才是删除。
缺失值填充的原则:
分类型数据:众数填充
数值型数据:正态分布,均值/中位数填充;偏态分布,中位数填充。

6.4查看样本分布

研究对象’Churn’列重新编码“Yes”=1,“No“=0

df['Churn'].replace(to_replace = 'Yes', value = 1,inplace = True)
df['Churn'].replace(to_replace = 'No', value = 0,inplace = True)
#df['Churn']=df['Churn'].map({'Yes':1,'No':0})
df['Churn'].head()
image.png
#绘制饼图,查看流失客户占比
churn_value=df["Churn"].value_counts()
labels=df["Churn"].value_counts().index

plt.figure(figsize=(7,7))
plt.pie(churn_value,labels=labels,colors=["b","w"], explode=(0.1,0),autopct='%1.1f%%', shadow=True)
plt.title("流失客户占比高达26.5%")
plt.show()
image.png

【分析】

流失客户样本占比26.5%,留存客户样本占比73.5%,明显的“样本不均衡”。
解决样本不均衡有以下方法可以选择:
分层抽样
过抽样
欠抽样

7、特征选择

提取特征

feature=df.iloc[:,1:20]

7.1、整数编码

#查看变量间的两两相关性
#重新编码
corr_df = feature.apply(lambda x: pd.factorize(x)[0])
corr_df.head()
#相关性矩阵
corr=corr_df.corr()
corr
image.png
#绘制热力图观察变量之间的相关性强弱
plt.figure(figsize=(15,12))
ax = sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns,
                 linewidths=0.2, cmap="RdYlGn",annot=True)
plt.title("Correlation between variables")
image.png

从热力图来看,互联网服务、网络安全、在线备份、设备维护服务、技术支持服务、开通网络电视服务、开通网络电影之间相关性很强,且是正相关。
电话服务和多线业务之间也存在很强的正相关关系。

7.2独热编码

查看研究对象"Churn"与其他变量下的标签相关性。

df_onehot = pd.get_dummies(df.iloc[:,1:21])
df_onehot.head()
image.png

绘图查看 用户流失(‘Churn’)与各个维度之间的关系

plt.figure(figsize=(15,6))
df_onehot.corr()['Churn'].sort_values(ascending=False).plot(kind='bar')
plt.title('Correlation between Churn  and variables ')
image.png

从图看gender(性别)、PhoneService(电话服务)相关性几乎为0,故两个维度可以忽略。
[‘SeniorCitizen’,‘Partner’,‘Dependents’,MultipleLines,‘InternetService’, ‘OnlineSecurity’, ‘OnlineBackup’, ‘DeviceProtection’,
‘TechSupport’, ‘StreamingTV’, ‘StreamingMovies’, ‘Contract’,
‘PaperlessBilling’,‘PaymentMethod’]等都有较高的相关性,将以上维度合并成一个列表kf_var,然后进行频数比较

kf_var=list(df.columns[2:5])
for var in list(df.columns[7:18]):
    kf_var.append(var)
print('kf_var=',kf_var)

输出
kf_var= ['SeniorCitizen', 'Partner', 'Dependents', 'MultipleLines', 'InternetService', 'OnlineSecurity', 'OnlineBackup', 'DeviceProtection', 'TechSupport', 'StreamingTV', 'StreamingMovies', 'Contract', 'PaperlessBilling', 'PaymentMethod']

8、统计分析

8.1、频数分布计较

8.8.1、卡方检验

#分组间确实是有显著性差异,频数比较的结论才有可信度,故需进行”卡方检验“,卡方检验”,就是提高频数比较结论可信度的统计方法
from scipy.stats import chi2_contingency   #统计分析 卡方检验
#自定义卡方检验函数
def KF(x):
    df1=pd.crosstab(df['Churn'],df[x])
    li1=list(df1.iloc[0,:])
    li2=list(df1.iloc[1,:])
    kf_data=np.array([li1,li2])
    kf=chi2_contingency(kf_data)
    if kf[1]<0.05:
        print('Churn by {} 的卡方临界值是{:.2f},小于0.05,表明{}组间有显著性差异,可进行【交叉分析】'.format(x,kf[1],x),'\n')
    else:
        print('Churn by {} 的卡方临界值是{:.2f},大于0.05,表明{}组间无显著性差异,不可进行交叉分析'.format(x,kf[1],x),'\n')
#对 kf_var进行卡方检验
print('kf_var的卡方检验结果如下:','\n')
print(list(map(KF, kf_var)))

kf_var的卡方检验结果如下:

Churn by SeniorCitizen 的卡方临界值是0.00,小于0.05,表明SeniorCitizen组间有显著性差异,可进行【交叉分析】

Churn by Partner 的卡方临界值是0.00,小于0.05,表明Partner组间有显著性差异,可进行【交叉分析】

Churn by Dependents 的卡方临界值是0.00,小于0.05,表明Dependents组间有显著性差异,可进行【交叉分析】

Churn by MultipleLines 的卡方临界值是0.00,小于0.05,表明MultipleLines组间有显著性差异,可进行【交叉分析】

Churn by InternetService 的卡方临界值是0.00,小于0.05,表明InternetService组间有显著性差异,可进行【交叉分析】

Churn by OnlineSecurity 的卡方临界值是0.00,小于0.05,表明OnlineSecurity组间有显著性差异,可进行【交叉分析】

Churn by OnlineBackup 的卡方临界值是0.00,小于0.05,表明OnlineBackup组间有显著性差异,可进行【交叉分析】

Churn by DeviceProtection 的卡方临界值是0.00,小于0.05,表明DeviceProtection组间有显著性差异,可进行【交叉分析】

Churn by TechSupport 的卡方临界值是0.00,小于0.05,表明TechSupport组间有显著性差异,可进行【交叉分析】

Churn by StreamingTV 的卡方临界值是0.00,小于0.05,表明StreamingTV组间有显著性差异,可进行【交叉分析】

Churn by StreamingMovies 的卡方临界值是0.00,小于0.05,表明StreamingMovies组间有显著性差异,可进行【交叉分析】

Churn by Contract 的卡方临界值是0.00,小于0.05,表明Contract组间有显著性差异,可进行【交叉分析】

Churn by PaperlessBilling 的卡方临界值是0.00,小于0.05,表明PaperlessBilling组间有显著性差异,可进行【交叉分析】

Churn by PaymentMethod 的卡方临界值是0.00,小于0.05,表明PaymentMethod组间有显著性差异,可进行【交叉分析】

[None, None, None, None, None, None, None, None, None, None, None, None, None, None]
【结论】

从卡方检验的结果,kf_var包含的特征,组间都有显著性差异,可进行频数比较

8.1.2、柱形图

频数比较-柱形图

plt.figure(figsize=(20,25))
a=0
for k in kf_var:
a=a+1
plt.subplot(4,4,a)
plt.title('Churn BY '+ k)
sns.countplot(x=k,hue='Churn',data=df)


image.png

【分析】
可以直接从柱形图去判断对哪个维度对流失客户的影响大吗?不能,因为“样本不均衡”(流失客户样本占比26.5%,留存客户样本占比73.5%),基数不一样,故不能直接通过“频数”的柱形图去分析。
解决办法:交叉分析,且作同行百分比('Churn’作为“行”)

8.1.3、交叉分析

print('ka_var列表中的维度与Churn交叉分析结果如下:','\n')
for i in kf_var:
    print('................Churn BY {}...............'.format(i))
    print(pd.crosstab(df['Churn'],df[i],normalize=0),'\n') #交叉分析,同行百分比

ka_var列表中的维度与Churn交叉分析结果如下:

................Churn BY SeniorCitizen...............
SeniorCitizen 0 1
Churn
0 0.871279 0.128721
1 0.745318 0.254682

................Churn BY Partner...............
Partner No Yes
Churn
0 0.471782 0.528218
1 0.642055 0.357945

................Churn BY Dependents...............
Dependents No Yes
Churn
0 0.655199 0.344801
1 0.825575 0.174425

................Churn BY MultipleLines...............
MultipleLines No No phone service Yes
Churn
0 0.491109 0.098956 0.409934
1 0.454254 0.090958 0.454789

................Churn BY InternetService...............
InternetService DSL Fiber optic No
Churn
0 0.379204 0.347700 0.273096
1 0.245586 0.693954 0.060460

................Churn BY OnlineSecurity...............
OnlineSecurity No No internet service Yes
Churn
0 0.393699 0.273096 0.333204
1 0.781701 0.060460 0.157838

................Churn BY OnlineBackup...............
OnlineBackup No No internet service Yes
Churn
0 0.358523 0.273096 0.368380
1 0.659711 0.060460 0.279829

................Churn BY DeviceProtection...............
DeviceProtection No No internet service Yes
Churn
0 0.364128 0.273096 0.362775
1 0.647940 0.060460 0.291600

................Churn BY TechSupport...............
TechSupport No No internet service Yes
Churn
0 0.391767 0.273096 0.335137
1 0.773676 0.060460 0.165864

................Churn BY StreamingTV...............
StreamingTV No No internet service Yes
Churn
0 0.361036 0.273096 0.365868
1 0.504013 0.060460 0.435527

................Churn BY StreamingMovies...............
StreamingMovies No No internet service Yes
Churn
0 0.356977 0.273096 0.369927
1 0.501873 0.060460 0.437667

................Churn BY Contract...............
Contract Month-to-month One year Two year
Churn
0 0.429068 0.252609 0.318322
1 0.885500 0.088818 0.025682

................Churn BY PaperlessBilling...............
PaperlessBilling No Yes
Churn
0 0.464438 0.535562
1 0.250936 0.749064

................Churn BY PaymentMethod...............
PaymentMethod Bank transfer (automatic) Credit card (automatic)
Churn
0 0.248550 0.249324
1 0.138042 0.124131

PaymentMethod Electronic check Mailed check
Churn
0 0.250097 0.252029
1 0.573034 0.164794
使用”电子支票“支付的人更容易流失

8.2、均值比较

组间有显著性差异,均值比较才有意义。

显著性检验,先通过了齐性检验,再通过方差分析,最后才能做均值比较

from scipy import stats
#自定义齐性检验 & 方差分析 函数
def ANOVA(x):
    li_index=list(df['Churn'].value_counts().keys())
    args=[]
    for i in li_index:
        args.append(df[df['Churn']==i][x])
    w,p=stats.levene(*args)             #齐性检验
    if p<0.05:
        print('警告:Churn BY {}的P值为{:.2f},小于0.05,表明齐性检验不通过,不可作方差分析'.format(x,p),'\n')
    else:
        f,p_value=stats.f_oneway(*args) #方差分析
        print('Churn BY {} 的f值是{},p_value值是{}'.format(x,f,p_value),'\n')
        if p_value<0.05:
            print('Churn BY {}的均值有显著性差异,可进行均值比较'.format(x),'\n')
        else:
            print('Churn BY {}的均值无显著性差异,不可进行均值比较'.format(x),'\n')
print('MonthlyCharges、TotalCharges的齐性检验 和方差分析结果如下:','\n')
ANOVA('MonthlyCharges')
ANOVA('TotalCharges')

MonthlyCharges、TotalCharges的齐性检验 和方差分析结果如下:

警告:Churn BY MonthlyCharges的P值为0.00,小于0.05,表明齐性检验不通过,不可作方差分析

警告:Churn BY TotalCharges的P值为0.00,小于0.05,表明齐性检验不通过,不可作方差分析

8.3、总结

用户出现以下特征比较容易流失:
SeniorCitizen:青年人
Partner :单身
Dependents :无经济独立
InternetService:开通了 “Fiber optic 光纤网络”
OnlineSecurity:没开通“网络安全服务”
OnlineBackup:没开通“在线备份业务”
DeviceProtection:没开通通了“设备保护业务
TechSupport:没开通“技术支持服务”
Contract:“按月”签订合同方式
PaperlessBilling:开通电子账单
PaymentMethod:使用“电子支票”支付的人
我们可以在SQL(数据库)上找有以上特征的客户,进行精准营销,即可以降低用户流失。虽然特征选得越多,越精确,但覆盖的人群也会越少。故,我们还需要计算“特征”的【重要性】,将最为重要的几个特征作为筛选条件。
计算特征的【重要性】,是“分类视角”,接下来我们会挑选常见的分类模型,进行批量训练,然后挑出得分最高的模型,进一步计算“特征重要性”。计算特征的【重要性】,是“分类视角”,接下来我们会挑选常见的分类模型,进行批量训练,然后挑出得分最高的模型,进一步计算“特征重要性”。

9、特征工程

9.1、提取特征

有前面的流失率与各个维度的相关系数柱状图可知:
流失率与gender(性别)、PhoneService(电话服务)相关性几乎为0,可以筛选掉,而customerID是随机数,不影响建模,故可以筛选掉。最终得到特征 churn_var

churn_var=df.iloc[:,2:20]
churn_var.drop("PhoneService",axis=1, inplace=True)
churn_var.head()
image.png

9.2、处理“量纲差异大”

“MonthlyCharges"、"TotalCharges"两个特征跟其他特征相比,量纲差异大
处理量纲差异大,有两种方法:
标准化
离散化
以上两种方法,哪个能让模型精度提高,就选哪个。根据模型的最后得分,我选了“离散化”来处理量纲差异大。

9.2.1、标准化

scaler = StandardScaler(copy=False)
scaler.fit_transform(churn_var[['MonthlyCharges','TotalCharges']])  #fit_transform拟合数据
churn_var[['MonthlyCharges','TotalCharges']]=scaler.transform(churn_var[['MonthlyCharges','TotalCharges']])  #transform标准化

print(churn_var[['MonthlyCharges','TotalCharges']].head() )#查看拟合结果
image.png

9.2.2 、特征离散化

特征离散化后,模型易于快速迭代,且模型更稳定

1、处理’MonthlyCharges’:

#查看'MonthlyCharges'列的4分位
churn_var['MonthlyCharges'].describe()
image.png

离散操作

18.25= 35.5 70.35 89.85=

#用四分位数进行离散
churn_var['MonthlyCharges']=pd.qcut(churn_var['MonthlyCharges'],4,labels=['1','2','3','4'])
churn_var['MonthlyCharges'].head()
image.png

2、处理’TotalCharges'

#查看'TotalCharges'列的4分位
churn_var['TotalCharges'].describe()
image.png

离散操作:
18= 402 1397 3786

#用四分位数进行离散
churn_var['TotalCharges']=pd.qcut(churn_var['TotalCharges'],4,labels=['1','2','3','4'])
churn_var['TotalCharges'].head()
image.png

9.3、分类数据转换成“整数编码”

9.3.1、查看churn_var中分类变量的label(标签)

#自定义函数获取分类变量中的label
def Label(x):
    print(x,"--" ,churn_var[x].unique())
#筛选出数据类型为“object”的数据点
df_object=churn_var.select_dtypes(['object'])
print(list(map(Label,df_object)))
image.png

通过同行百分比的“交叉分析”发现,label “No internetserive”的人数占比在以下特征[OnlineSecurity,OnlineBackup,DeviceProtection,TechSupport,StreamingTV,StreamingTV]都是惊人的一致,故我们可以判断label “No internetserive”不影响流失率。
因为这6项增值服务,都是需要开通“互联网服务”的基础上才享受得到的。不开通“互联网服务”视为没开通这6项增值服务,故可以将 6个特正中的“No internetserive” 并到 “No”里面。

churn_var.replace(to_replace='No internet service',value='No',inplace=True)

而特征MultipleLines的“ No phoneservice”在流失客户、留存客户样本中的人数占比几乎接近,且比较少,故可以将“ No phoneservice”并到“No”。

churn_var.replace(to_replace='No phone service',value='No',inplace=True)
df_object=churn_var.select_dtypes(['object'])
print(list(map(Label,df_object.columns)))
image.png

9.3.2、整数编码

整数编码的方法有两种:
sklearn中的LabelEncoder()
pandas中的factorize
此处选用 LabelEncoder()

def labelencode(x):
    churn_var[x] = LabelEncoder().fit_transform(churn_var[x])
for i in range(0,len(df_object.columns)):
    labelencode(df_object.columns[i])
print(list(map(Label,df_object.columns)))
image.png

9.4、处理“样本不均衡”

分拆变量

x=churn_var
y=df['Churn'].values
print('抽样前的数据特征',x.shape)
print('抽样前的数据标签',y.shape)

抽样前的数据特征 (7043, 17)
抽样前的数据标签 (7043,)
处理样本不均衡常用的方式有三种:
分层抽样
过抽样
欠抽样
先后尝试了“分层抽样”和“欠抽样”,前者最终得到的模型中精度最高的是0.63,而后者最终得到的模型中精度最低是0.78,最高是0.84。

结论

image.png

1.tenure:1-5号职位的用户比较容易流失
2.PaymentMethod:使用“电子支票”支付的人
3.MonthlyCharges 、TotalCharges:总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失
4.PaperlessBilling:开通电子账单
5.Partner:单身
6.OnlineBackup:没开通“在线备份业务”
7.InternetService:开通了 “Fiber optic 光纤网络”
8.TechSupport:没开通“技术支持服务”
9.DeviceProtection:没开通通了“设备保护业务
10.OnlineSecurity:没开通“网络安全服务”
11.Contract:“按月”签订合同方式
12.Dependents:无经济独立
13.SeniorCitizen :青年人
14.TotalCharges:总费用在2281.92元以下,月费用在64.76元以上的客户比较容易流失

当条件覆盖得越多,人群越精确,但与此同时,覆盖的人群也会越少。业务方可直接在数据库中,通过SQL检索符合要求的客户,然后做针对性的运营工作。

分析思路

“分析视角”是“分析方法”的灵魂。

分析方法有上百种,但“分析视角”只有四种:

--对比视角
--分类视角
--相关视角
--描述视角

一旦将”业务需求“拆解成指标,接下来只需要针对每个指标进行”分析视角“四选一即可

数据集描述,已经将变量分为三个维度了:用户属性、用户行为、研究对象(是否流失客户),三个维度组合一下就得出了以下解题思路了:
哪些属性的用户比较容易流失?
哪些行为的用户比较容易流失?

以上两个分析思路运用的是【对比视角】,该视角下具体的分析方法有:

--数值型数据:均值比较
--分类型数据:频数分布比较(交叉分析)
以上的分析方法是统计分析,只能一个维度一个维度地去比较。但实际情况中,并不是每个维度的权重都一样的,那如何去研究各个维度的权重?
“权重问题”属于“分类视角”,故我们可以采用”分类模型",要用哪个”分类模型“呢?不知道。可以全部采用,看模型精度得分,然后选得分最高的模型进行进一步预测。
--Random Forest 随机森林
--SVC 支持向量机
--LogisticRegression 逻辑回归
--KNN 近邻算法
--Naive Bayes 朴素贝叶斯
--Decision Tree 决策树
--AdaBoost
--GradientBoosting
--XGB
--CatBoost

运营建议

如何留住客户,可以从两方面去思考:

1、增加用户的沉没成本(损失厌恶)
a.会员等级
b.积分制
c.充值赠送
d.满减券
e.其他增值服务
2、培养用户的条件反射(习惯)
a.会员日
b.定期用户召回
c.签到
d.每日定时抽奖
e.小游戏

电子账单解锁新权益

a.现象:“开通电子账单”的人反而容易流失
b.基本假设:价格敏感型客户。电子账单,让客户理性消费。
c.建议:让“电子账单”变成一项“福利。跟连锁便利店,联名发"商品满减券",每月的账单时间,就将"商品满减券“和账单一起推送过去。文案:您上月消费了XX元,解锁了xx会员权益。
d.底层规律:增加沉没成本。

“单身用户”尊享亲情网

a.现象:“单身用户”容易流失
b.基本假设:社交欲望低
c.建议:一个单身用户拥有建立3个人以内的“亲情网”的权益
d.底层规律:增加沉没成本。

本文章借鉴、学习码农家园上的一篇文章。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355