电商零售“人货场”模型数据分析

项目背景

电商零售的常用指标按“人—货—场”的逻辑分为三类,本文将围绕这三个核心,对某大型全球超市4年(2011-2014年)的零售数据进行分析,对提升企业运营效率与营收提出有效的建议

1、明确问题

为了分析并提升企业的整体营收,本文提出以下3个方面的问题:

1. 企业整体运营情况分析,了解运营现状,及对未来经营战略做出调整与预测

2. 商品结构分析,了解企业不同商品销售情况,挖掘目前受消费者青睐的商品?什么价格的商品最有吸引力,优惠力度如何?哪些商品存在关联关系?目前的物流费用如何?给出后续不同商品运营的建议

3. 客户价值分析,了解企业客户结构,并运用RFM模型对客户进行价值分类,为后续的定制化运营策略提供依据

2、核心结论

企业运营情况
1、GMV/销售量/利润持续向好,2014年GMV总量达到430万;
2、商品销售上半年为淡季,下半年为旺季。对于旺季的月份,运营推广等策略要继续维持,还可以加大投入,提高整体销售额;对于淡季的月份,可以结合产品特点进行新产品拓展,举办一些促销活动等吸引客户;
3、付费人数逐年上升,老客户比重、人均消费额、复购率逐年提高,但新客户数量每年逐步下降,需从客户获取角度进行突破,实现新的利润增长点;
4、美、中、印、英利润贡献排名均高于其销售额贡献,对于这些国家的客户开拓需要保持并加强;加拿大地区销售表现不佳,可根据总体战略布局进行取舍,欧中非地区规模不大,但增速可观,可作为未来新的销售增长点;
商品销售分析
1、目前的优势产品为:手机、复印机、机械设备、电子配件、书柜、椅子、桌子、电器、储藏箱,其中桌子类目存在高额度打折促销,目前出现亏损情况,需要结合实际业务经营策略进行调整(是否清库存);
2、目前订单金额主要集中在0-100元区间,且该区间范围内优惠力度最大;未来可考虑提高100-200元区间的优惠力度,提高笔单价;
3、通过关联分析发现,折叠椅、打印机、真空袋、信封、桌子与订书钉存在着一定的关联关系,可通过捆绑销售订书钉或个性化推荐等方式,提高相关类目的销量;
4、中国地区和印度地区的物流费用偏高,有待优化;部分低订单量地区(乍得共和国、中国台湾等)物流费用偏高,可作战略性调整;
客户分析
1、超过一半以上的客户为普通消费者consumer,且每类客户每年均在保持增长趋势,客户结构较好;
2、目前客户群体主要分为四类:低频低消费活跃用户、低频低消费沉睡用户,高频低消费活跃用户,高频高消费活跃用户,需要对此四类用户进行定制化的运营策略;

3、理解数据

数据来源:是某大型全球超市4年(2011-2014年)的零售数据,总共51290条数据,共24个字段

3.1 导入所需要的包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
from sklearn.metrics import silhouette_score # 导入轮廓系数指标
from sklearn.cluster import KMeans # KMeans模块
from sklearn.preprocessing import MinMaxScaler
%matplotlib inline
## 设置属性防止中文乱码
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False

3.2 导入并查看数据

data = pd.read_csv('superstore_dataset2011-2015.csv')
data.head()
data.info()
image.png

3.3 数据清洗

(1)数据格式转换

data['Order Date'] = data['Order Date'].str.replace('/','-')
data['Ship Date'] = data['Ship Date'].str.replace('/','-')
data['Order Date'] = pd.to_datetime(data['Order Date'],format='%d-%m-%Y')
data['Ship Date'] = pd.to_datetime(data['Ship Date'],format='%d-%m-%Y')
data['Ship time'] = data['Ship Date']-data['Order Date']

(2)缺失值处理

data.isnull().sum()

仅邮编一列出现缺失值,暂不处理
(3)异常值处理

data.descirbe()

无异常值出现


image.png

(4)添加额外字段

data['month'] = data['Order Date'].map(lambda x:x.month)
data['year'] = data['Order Date'].map(lambda x:x.year)
data['unit_price'] = data['Sales']/data['Quantity']

4、总体运营分析

总体运营关键指标主要包括GMV/销售量/利润、付费人数、ARPPU、复购率,本问从这四个指标描述整体的运营情况

其中GMV代表公司整体的规模、付费人数反馈产品对市场的影响力和市场份额、ARPPU反应产品定位的消费人群,复购率代表用户的忠诚程度,代表产品的健康程度

image

4.1 GMV/销售量/利润

该超市2011-2014年每年业绩呈现上升趋势,销量、销售量、利润都在上升,且增长率在2011-2013年期间逐年提升,2014稍有放缓,但仍然客观,销售额从2011年的226w到2014年的430w(制图Tableau);

该超市的销售季节性还是挺明显的,总体上半年是淡季,下半年是旺季,同时销售额和销量同比上一年均再提高(制图Tableau);

对于旺季的月份,运营推广等策略要继续维持,还可以加大投入,提高整体销售额
对于淡季的月份,可以结合产品特点进行新产品拓展,举办一些促销活动等吸引客户

image.png

4.2 付费人数/人均指标/复购率

从表中可以看出,付费人数逐年上升,老客户比重、人均消费额、复购率逐年提高,总体运营情况向好,但新客户数量每年逐步下降,说明新客户的获取率较低,如果能够在客户获取上得到突破,能给企业带来较大的增长空间


image.png

新老客户计算

#计算每年用户数量以及新老比例
year_num = data['year'].value_counts().index.tolist()
user_cnt = []
user_rebuy = []
for i in range(len(year_num)):
    user = (data[data['year']==year_num[i]][['Order Date','Customer ID','Sales']])
    user_c = user.groupby('Customer ID').agg({'Sales':np.sum})
    user_count = user['Customer ID'].drop_duplicates()
    print('%a年用户数为%i'%(year_num[i],user_count.count()))
    user_cnt.append(user_c)
    user_rebuy.append(user)
#2014年新老用户
old_customer = user_cnt[0].merge(user_cnt[1],on='Customer ID')['Sales_x']
print('2014老用户数量:%a'%(old_customer.count()))
print('2014老用户人均消费额:%a'%(old_customer.sum()/old_customer.count()))
new = user_cnt[0]['Sales'].count()-old_customer.count()
print('2014新用户数量:%a'%(new))
pay = user_cnt[0]['Sales'].sum()-old_customer.sum()
print('2014新用户人均消费额:%a'%(pay/new))
#2013年新老用户
old_customer = user_cnt[1].merge(user_cnt[2],on='Customer ID')['Sales_x']
print('2013老用户数量:%a'%(old_customer.count()))
print('2013老用户人均消费额:%a'%(old_customer.sum()/old_customer.count()))
new = user_cnt[1]['Sales'].count()-old_customer.count()
print('2013新用户数量:%a'%(new))
pay = user_cnt[1]['Sales'].sum()-old_customer.sum()
print('2013新用户人均消费额:%a'%(pay/new))
#2012年新老用户
old_customer = user_cnt[2].merge(user_cnt[3],on='Customer ID')['Sales_x']
print('2012老用户数量:%a'%(old_customer.count()))
print('2012老用户人均消费额:%a'%(old_customer.sum()/old_customer.count()))
new = user_cnt[2]['Sales'].count()-old_customer.count()
print('2012新用户数量:%a'%(new))
pay = user_cnt[2]['Sales'].sum()-old_customer.sum()
print('2012新用户人均消费额:%a'%(pay/new))
customer = user_cnt[0]['Sales']
print('2014用户人均消费额:%a'%(customer.sum()/old_customer.count()))
customer = user_cnt[1]['Sales']
print('2013用户人均消费额:%a'%(customer.sum()/old_customer.count()))
customer = user_cnt[2]['Sales']
print('2012用户人均消费额:%a'%(customer.sum()/old_customer.count()))
customer = user_cnt[3]['Sales']
print('2011用户人均消费额:%a'%(customer.sum()/old_customer.count()))

复购率计算

rebuy_2014 = user_rebuy[0].groupby('Customer ID').count()
one = rebuy_2014[rebuy_2014['Sales']==2]['Sales'].count()
print('2014复购一次以上:%i'%(one))
twice = rebuy_2014[rebuy_2014['Sales']>2]['Sales'].count()
print('2014复购两次以上:%i'%(twice))
rebuy_2013 = user_rebuy[1].groupby('Customer ID').count()
one = rebuy_2013[rebuy_2013['Sales']==2]['Sales'].count()
print('2013复购一次以上:%i'%(one))
twice = rebuy_2013[rebuy_2013['Sales']>2]['Sales'].count()
print('2013复购两次以上:%i'%(twice))
rebuy_2012 = user_rebuy[2].groupby('Customer ID').count()
one = rebuy_2012[rebuy_2012['Sales']==2]['Sales'].count()
print('2012复购一次以上:%i'%(one))
twice = rebuy_2012[rebuy_2012['Sales']>2]['Sales'].count()
print('2012复购两次以上:%i'%(twice))
rebuy_2011 = user_rebuy[3].groupby('Customer ID').count()
one = rebuy_2011[rebuy_2011['Sales']==2]['Sales'].count()
print('2011复购一次以上:%i'%(one))
twice = rebuy_2011[rebuy_2011['Sales']>2]['Sales'].count()
print('2011复购两次以上:%i'%(twice))

4.3市场格局分析

亚太、欧盟、美国、拉丁美洲为GMV主要贡献地区,加拿大地区表现不佳可根据总体战略布局进行取舍,欧中非地区规模不大,但增速可观,可作为未来新的销售增长点(Tableau制图)


image.png

美、中、印、英利润贡献排名均高于其销售额贡献,对于这些国家的客户开拓需要保持并加强,对于利润为负的国家,可结合战略布局进行取舍


image.png

5、商品分析

5.1 商品销售结构分析(2014年)

product = data[data['year']==2014]
product_top5 = product[['Sub-Category','Sales','Profit']].groupby(['Sub-Category']).sum()
product_top5 = product_top5.sort_values(by='Sales',ascending=False)
product_top5.plot(kind='bar',grid=True,alpha=0.7)
image.png

可以看到,电子产品:手机、复印机、机械设备、电子配件,家具:书柜、椅子、桌子;办公用品:电器、储藏箱为主要自家优势产品,占总销售84%,后续经营中应继续保持,可以结合整体战略发展适当加大投入,逐渐形成自己的品牌。
同时可以发现,目前桌子的利润为负,表明这个产品目前处于亏损状态,应该是促销让利太多。通过检查原数据,发现Tables大部分都在打折,打折的销量高达76%。如果是在清库存,这个效果还是不错的,但如果不是,说明这个产品在市场推广上遇到了瓶颈,或者是遇到强竞争对手,需要结合实际业务进行分析,适当改善经营策略。

5.2 笔单价及优惠力度

discount = data[['Sales','Discount','Profit','year']]
discount = discount[discount['year']==2014]
discount['price_zone'] = pd.cut(discount['Sales'],bins=[0,100,200,300,400,500,600,700,800,900,1000,10000])
discount['price_zone'].value_counts().plot(kind='bar',grid=True,alpha=0.5)
image.png
discount_p = discount[['Discount','price_zone']].groupby('price_zone').agg({'Discount':np.average}).reset_index()
discount_p
image.png

目前每笔订单单价主要集中在0-100区间,且该区间优惠力度最大,未来可考虑提高100-200区间的折扣力度,提高用户的笔单价

5.3 商品关联分析

from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
data_new = data[data['Country']=='United States']
basket = data_new[['Order ID','Product Name','Quantity']].groupby(['Order ID','Product Name'])['Quantity']\
.sum().unstack().reset_index().fillna(0).set_index('Order ID')
#至少出现3次以上
min_value = 3/basket.shape[0]
print(min_value)
def encode_units(x):
    if x <= 0:
        return 0
    if x >= 1:
        return 1
basket_sets = basket.applymap(encode_units)
frequent_itemsets = apriori(basket_sets, min_support=min_value, use_colnames=True)
frequent_itemsets
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=0.6) #min_threshold:置信度
rules.sort_values(by='confidence',ascending=False)
l1 = rules['antecedents'].value_counts().index.tolist()
l2 = rules['consequents'].value_counts().index.tolist()
l1.extend(l2)
l1 = list(set(l1))
l1 =[list(i)[0] for i in l1]
indx = []
for i in range(len(l1)):
    index = np.where(data['Product Name']==l1[i])[0]
    indx.extend(index)
sales = data.iloc[indx,:][['Product Name','Quantity']].groupby('Product Name').agg({'Quantity':np.sum})
sales.plot(kind='bar',grid=True,alpha=0.7)
image.png

从上图发现,在办公场景下,折叠椅、打印机、真空袋、信封、桌子与订书钉存在着一定的关联关系,可以理解为新办公室下相关办公用品的配置中订书钉是一个频繁出现的购置项目。


image.png

进一步,我们通过商品的销量发现,订书钉的需求强度较其他关联产品更高,可以尝试通过捆绑销售或赠送订书钉、购买订书钉赠送其他产品优惠券、个性化推荐等方法,提高销量。

5.4 物流地图

order_info = data[['Country','Shipping Cost','Ship time','Ship Mode','Order ID']]
order_info['Ship time'] = order_info['Ship time'].apply(lambda x:x.days)
order_1 = order_info.groupby('Country').agg({'Order ID':'count','Shipping Cost':np.average,'Ship time':np.average})
order_1 = order_1.sort_values(by='Order ID',ascending=False).reset_index().rename(columns={'Order ID':'Order num'})
order_1
order_1 = order_info.groupby('Country').agg({'Order ID':'count','Shipping Cost':np.average,'Ship time':np.average})
order_1 = order_1.sort_values(by='Order ID',ascending=False).reset_index().rename(columns={'Order ID':'Order num'})
order_1['percentage'] = order_1['Order num'].cumsum()/order_1['Order num'].sum()
order_1.head(10).style.background_gradient(cmap='Greens',axis =0,low=0,high=1)

订单量前10的地区中,中国和印度地区的运费偏高,对于此类订单量较高的地区,可以依赖高订单数目和物流公司洽谈“优惠价格”,降低物流成本

india_order = order_info[order_info['Country']=='India'][['Ship Mode','Shipping Cost']].groupby('Ship Mode').agg({'Shipping Cost':['mean','count']})
india_order.style.background_gradient(cmap='Greens',axis =0,low=0,high=1)

不同物流方式的平均费用

shipping_cost = order_info[['Ship Mode','Shipping Cost']].groupby('Ship Mode').agg({'Shipping Cost':np.average})
shipping_cost.style.background_gradient(cmap='Greens',axis =0,low=0,high=1)

印度地区不同物流方式平均费用

![image.png](https://upload-images.jianshu.io/upload_images/25889599-f2a5fadd4643103f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

order_1 = order_info.groupby('Country').agg({'Order ID':'count','Shipping Cost':np.average,'Ship time':np.average})
order_1 = order_1.sort_values(by='Order ID',ascending=False).reset_index().rename(columns={'Order ID':'Order num'})
order_1['percentage'] = order_1['Order num'].cumsum()/order_1['Order num'].sum()
order_1[order_1['Shipping Cost']>50].style.background_gradient(cmap='Greens',axis =0,low=0,high=1)

中国地区不同物流方式平均费用

china_order = order_info[order_info['Country']=='China'][['Ship Mode','Shipping Cost']].groupby('Ship Mode').agg({'Shipping Cost':['mean','count']})
china_order.style.background_gradient(cmap='Greens',axis =0,low=0,high=1)
image.png

进一步分析发现,印度地区的Same Day配送方式和中国地区的First Class配送方式均存在着一定的优化空间

image.png

可以看到,如中国台湾、乍得共和国、莱索托王国等地区订单量较少且运费十分高昂,可以结合战略布局进行适当调整


image.png

6、用户分析

6.1 用户结构

超过一半以上的客户为普通消费者consumer,且每类客户每年均在保持增长趋势,客户结构还是非常不错的,而corporate和home office则属于需要长期稳定客户。


image.png

6.2 用户RFM分层

一般在大型促销(譬如双11)开始之前,电商运营者便会通过微信、短信、邮件以及其他传播工具进行客户唤醒与激活。在此场景下,我们便需要为其提供“用户清单”,以便运营者能够有针对性对用户进行运营。

RFM模型:Recency(客户最近一次消费)、Frequency(客户消费频率)、Money(客户消费金额),通过搭建RFM模型,可以对用户进行分层,制定不同的策略。
一般而言,可以通过Recency定义活跃用户和沉睡用户,Frequency定义高频消费用户和低频消费用户,Money定义高价值用户和低价值用户,从而划分出8个人群。
但是,往往高价值用户也是消费频率较高的用户,可能不会出现完整的8类人群,没有必要完全定制8类运营策略,本文通过K-means聚类算法,对具有R、F、M相似特征的人群进行聚类分析

max_date = data['Order Date'].max()
#计算Recency
R = data[['Order Date','Customer ID']].groupby('Customer ID').max()
R['Order Date'] = R['Order Date']-max_date
R['Order Date'] = R['Order Date'].apply(lambda x:x.days)
R = R.rename(columns={'Order Date':'Recency'})
#计算Frequency
F = data[['Order Date','Customer ID']].groupby('Customer ID').count()
F = F.rename(columns={'Order Date':'Frequency'})
#计算Money
M = data[['Customer ID','Sales']].groupby('Customer ID').sum()
M = M.rename(columns={'Sales':'Money'})
RFM = R.merge(F,on='Customer ID').merge(M,on='Customer ID')
RFM
image.png
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8,8))
ax = Axes3D(fig)
ax.scatter(RFM['Recency'],RFM['Frequency'],RFM['Money'],c='g')
image.png

从直观上看,人群大致可以分为四类,低频低消费活跃用户、低频低消费沉睡用户,高频低消费活跃用户,高频高消费活跃用户,因此,此处K值设置为4

model_scaler = MinMaxScaler()  # 建立MinMaxScaler模型对象
X = model_scaler.fit_transform(RFM)  # MinMaxScaler标准化处理
model_kmeans = KMeans(n_clusters=4)  # 建立聚类模型对象
cluster_labels_k = model_kmeans.fit_predict(X)
# 将原始数据与聚类标签整合
RFM = RFM.reset_index()
cluster_labels = pd.DataFrame(cluster_labels_k, columns=['clusters'])  # 获得训练集下的标签信息
merge_data = pd.concat((RFM, cluster_labels), axis=1)
cluster_1 = merge_data[merge_data['clusters']==0]
cluster_2 = merge_data[merge_data['clusters']==1]
cluster_3 = merge_data[merge_data['clusters']==2]
cluster_4 = merge_data[merge_data['clusters']==3]
fig = plt.figure(figsize=(8,8))
ax = Axes3D(fig)
ax.scatter(cluster_1['Recency'], cluster_1['Frequency'],cluster_1['Money'], c='r',label=cluster_1['clusters'])
ax.scatter(cluster_2['Recency'], cluster_2['Frequency'],cluster_2['Money'], c='g',label=cluster_2['clusters'])
ax.scatter(cluster_3['Recency'], cluster_3['Frequency'],cluster_3['Money'], c='b',label=cluster_3['clusters'])
ax.scatter(cluster_4['Recency'], cluster_4['Frequency'],cluster_4['Money'], c='y',label=cluster_4['clusters'])
ax.set_zlabel('消费总金额', fontdict={'size': 15, 'color': 'black'})
ax.set_ylabel('消费频率', fontdict={'size': 15, 'color': 'black'})
ax.set_xlabel('最近一次消费距今时长', fontdict={'size': 15, 'color': 'black'})
image.png

用户分层列表


image.png

具体策略:

对于低价值沉睡用户,主要以“唤醒”为主,常见的策略是告知其本次促销力度,以及提供适量额度的优惠券;

对于低价值活跃用户,需要通过大额度优惠券培养用户的消费习惯,通过短信告知其促销信息和力度。

对于低价值忠诚用户(高频低消费活跃用户),运营部门可以对这批用户进行调研,了解他们的兴趣点及对产品的改良建议,并根据客户的消费频次以及购买偏好配上走心的文案。

如:亲爱的女王,最近12个月,您在小的店铺共眷顾了9次以上。所以您被评选为小店最最亲爱的女王。在此七夕活动之际,小店精选爆款5折起,另外还有满999元减100等大尺度的优惠。同时,小的还特意为您准备了面额50元的代金券,供您驱使。恭候您光临。(女王节预热)

对于高价值忠诚用户,定制个性化、差异化的服务,提高高质量用户的忠诚度;

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

推荐阅读更多精彩内容