Python文本挖掘数据分析(结)

任务三 竞争分析

对比市场份额前三的拜耳、安速、科凌虫控,挖掘拜耳市场增长策略

  1、产品分布情况
  2、产品结构特征(BCG矩阵)及发展策略
  3、流量结构及推广策略
  4、舆情评论及情感分析(拜耳公司)

读数据
os.chdir('..')
os.chdir('./竞争数据')


使用商品销售数据分析各家的产品类别的分布

#准备数据
os.chdir('./商品销售数据')
filenames2 = glob.glob('*.xlsx')
df3 = pd.read_excel(filenames2[1])
df3.head()
#定义函数
def load_xlsx1(filename):
    df = pd.read_excel(filename)
    useless = ['序号','店铺名称','主图链接',
               '商品链接','商品名称']
    df.drop(columns=useless,inplace=True)
    return df
df3an = load_xlsx1(filenames2[0])#安速
df3an.head()

df3bai = load_xlsx1(filenames2[1])#拜尔
df3bai.head()

df3kl = load_xlsx1(filenames2[2])#科凌虫控
df3kl.head()
类目 
bai31 = df3bai.groupby('类目').sum()
an31 = df3an.groupby('类目').sum()
kl31 = df3kl.groupby('类目').sum()
#作图
fig, axes = plt.subplots(1, 3, figsize=(10, 6))
ax = axes[0]
bai31['销售额'].plot.pie(autopct='%.f',title='拜耳',startangle=30,ax=ax)
ax.set_ylabel('')
ax = axes[1]
an31['30天销售额'].plot.pie(autopct='%.f',title='安速',startangle=60,ax=ax)
ax.set_ylabel('')
ax = axes[2]
kl31['30天销售额'].plot.pie(autopct='%.f',title='科凌虫控',startangle=90,ax=ax)
ax.set_ylabel('')
plt.show()

 

适用对象
bai32 = df3bai.groupby('使用对象').sum()
an32 = df3an.groupby('适用对象').sum()
kl32 = df3kl.groupby('适用对象').sum()
#作图
fig, axes = plt.subplots(1, 3, figsize=(10, 6))
ax = axes[0]
bai32['销售额'].plot.pie(autopct='%.f',title='拜耳',startangle=30,ax=ax)
ax.set_ylabel('')
ax = axes[1]
an32['30天销售额'].plot.pie(autopct='%.f',title='安速',startangle=60,ax=ax)
ax.set_ylabel('')
ax = axes[2]
kl32['30天销售额'].plot.pie(autopct='%.f',title='科凌虫控',startangle=90,ax=ax)
ax.set_ylabel('')
plt.show()

 

产品结构分析 

读数据
os.chdir('..')
os.chdir('./商品交易数据')

filenames3 = glob.glob('*.xlsx')
filenames3
df4bai = pd.read_excel(filenames3[1])
df4bai.head()#数据展示
df4bai.info()
df4bai['商品'].value_counts().count()

#五个月的数据,每个商品至多五个月都有,至少有一个月,故需要对商品分类汇总

自定义分类函数

def byproduct(df):
    dfb = df.groupby('商品').mean().loc[:,['交易增长幅度']]
    dfb['交易金额'] = df.groupby('商品').sum()['交易金额']
    dfb['交易金额占比'] = dfb['交易金额']/dfb['交易金额'].sum()
    dfb['商品个数'] = df.groupby('商品').count()['交易金额']
    dfb.reset_index(inplace=True)
    return dfb
拜尔 

拜耳-BCG图 

bai4 = byproduct(df4bai)
bai4.describe()

 

  • 其中交易增长幅度可表示市场发展率,交易金额占比可表示市场份额
  • 这两个指标的最大值都远大于3/4分位数,认为是异常值,考虑引入盖帽法,方便后续作图
#定义盖帽法函数
def block(x):
    qu = x.quantile(.9)
    out = x.mask(x>qu,qu)
    return(out)
#分别定义对两个指标盖帽的函数
def block2(df):
    df1 = df.copy()
    df1['交易增长幅度'] = block(df1['交易增长幅度'])
    df1['交易金额占比'] = block(df1['交易金额占比'])
    return df1
bai41 = block2(bai4)
bai41.describe()

 

# 函数3:绘制波士顿矩阵图
def plotBCG(df,mean=False,q1=0.5,q2=0.5):
    f,ax = plt.subplots(figsize=(10,8))
    ax = sns.scatterplot('交易金额占比','交易增长幅度',
                        hue='商品个数',size='商品个数',sizes=(20,200),
                        palette='cool',legend='full',data=df)
    for i in range(0,len(df)):
        ax.text(df['交易金额占比'][i]+0.001,df['交易增长幅度'][i],i)
    if mean:  # 均值线
        plt.axvline(df['交易金额占比'].mean())
        plt.axhline(df['交易增长幅度'].mean())
    else:
        plt.axvline(df['交易金额占比'].quantile(q1))
        plt.axhline(df['交易增长幅度'].quantile(q2))
    plt.show()
plotBOG(bai41,mean=True)

 

     可以根据实际的业务选择区间的分隔线,由行业经验确定(例如认为增幅0.1在行业里算高,就可以作为分隔线);明星产品和奶牛产品的商品个数普遍比较多;没有突出的明星产品,但是有快进入明星产品的问题产品

拜耳-明星产品

# 函数4:根据BCG矩阵,抽取明星、奶牛、问题产品
def extractBCG(df,q1=0.5,q2=0.5,by='交易金额占比'):
    '''
    从原始数据中,抽取明星产品、奶牛产品、问题产品
    '''
    # 明星产品
    star = df.loc[(df['交易金额占比']>=df['交易金额占比'].quantile(q1)
            ) & (df['交易增长幅度']>=df['交易增长幅度'].quantile(q2)),:]
    star = star.sort_values(by,ascending=False)
    # 奶牛产品:关心市场份额,依交易金额占比排序
    cow = df.loc[(df['交易金额占比']>=df['交易金额占比'].quantile(q1)
            ) & (df['交易增长幅度']<df['交易增长幅度'].quantile(q2)),:]
    cow = cow.sort_values(by,ascending=False)
    # 问题产品:关心市场增长率,依交易增长幅度排序
    que = df.loc[(df['交易金额占比']<df['交易金额占比'].quantile(q1)
            ) & (df['交易增长幅度']>=df['交易增长幅度'].quantile(q2)),:]
    que = que.sort_values(by,ascending=False)
    return star,cow,que
baistar,baicow,baique = extractBOG(bai4)
baistar1,baicow1,baique1 = extractBOG(bai4,by='交易增长幅度')
baistar

 

拜耳奶牛产品/老爆款

baicow

拜耳问题产品/潜力款

baique1

 

安速 
df4an = pd.read_excel(filenames3[0])
df4an.head(2)#读数据
df4an.info()
df4an['商品'].value_counts().count()

汇总指标

an4 = byproduct(df4an)
an4.describe()
#盖帽法处理
an41 = block2(an4)
an41.describe()

 

BCG图

plotBOG(an41)

 

查看具体产品 

anstar,ancow,anque = extractBOG(an4)
anstar1,ancow1,anque1 = extractBOG(an4,by='交易增长幅度')

安速明星 

anstar

安速奶牛

ancow

安速问题

anque1

 

科凌虫控 
#读数据
df4kl = pd.read_excel(filenames3[2])
df4kl.head(2)
df4kl.info()
df4kl['商品'].value_counts().count()

汇总指标

kl4 = byproduct(df4kl)
kl4.describe()
#盖帽函数
kl41 = block2(kl4)
kl41.describe()

 BCG-图

plotBOG(kl41)

 

查看具体产品

klstar,klcow,klque = extractBOG(kl4)
klstar1,klcow1,klque1 = extractBOG(kl4,by='交易增长幅度')

 科凌虫控明星

klstar

科凌虫控奶牛

klcow

科凌虫控问题

klque1

流量结构分析 

#数据准备
os.chdir('..')
os.chdir('./流量渠道数据')
filenames4 = glob.glob('*.xlsx')
filenames4
# 自定义流量结构及说明函数
def flow(df):
	'''
	流量结构及说明函数
	'''
    df0 = df.copy()
    top10 = df0.sort_values('交易指数',ascending=False
                           ).reset_index(drop=True).iloc[:10,:]  
    top10['交易指数占比'] = top10['交易指数']/top10['交易指数'].sum()  
    top10.set_index('流量来源',inplace=True)
    paid =  ['付费流量','直通车','淘宝客','淘宝联盟']  #查得4个付费流量渠道
    ind = np.any([top10.index == i for i in paid],axis=0)   
    explode = ind * 0.1  
    ax = top10['交易指数占比'].plot.pie(autopct='%.2f%%',
                                  figsize=(5,5),explode=explode)
    ax.set_ylabel('')
    plt.show()
    paidsum = top10['交易指数占比'][ind].sum()
    salesum = top10['交易指数'].sum() 
    paidsale = salesum * paidsum
    print(f'前10流量中:\
总交易指数:{salesum:.0f},付费流量占比:{paidsum*100:.2f}%,付费流量带来交易指数:{paidsale:.0f}')  
    return top10

拜尔

bai5top10 = flow(df5bai)

安速

an5top10 = flow(df5an) 

 

科凌虫控

kl5top10 = flow(df5kl)

 

舆情分析

(1)去非中英文(英文应变小写)
(2)分词(jieba/stemming--自定义词典--搜狗词库)
(3)去停用词
(4)去低频词

#数据
os.chdir('..')
os.chdir('./评论舆情数据')
filenames5 = glob.glob('*.xlsx')
df6bai = pd.read_excel(filenames5[1])
df6bai.head()
#抽评论列
bai6 = list(df6bai['评论'])
#去掉非英文字符
#\u4E00-\u9Fa5表示汉字unicode编码下的编码范围,多达20892个方块字,5*16*16*16=20480
bai61 = [re.sub(r'[^a-z\u4E00-\u9Fa5]+',' ',i,
                flags=re.I) for i in bai6]
#文本处理的库:shorttext
bai61

读取构建停用词列表 

stopwords = list(pd.read_csv('data/百度停用词表.txt',
                             encoding='UTF-8',names=['stopwords'])['stopwords'])
stopwords.extend([' '])
# 分词函数
def w_cut(df):
    df_new = []
    for i in df:
        seg0 = pd.Series(jieba.lcut(i))
        ind3 = pd.Series([len(j) for j in seg0])>1 #筛选出长度大于1的词
        seg1 = seg0[ind3]
        ind31 = ~seg1.isin(pd.Series(stopwords)) #去停用词并去重
        seg2 = list(seg1[ind31].unique())
        if len(seg2)>0:  #去空列表
            df_new.append(seg2)
    return df_new

绘制词云图

# 绘制词云图函数
def word_cloud(df):
    mask = imageio.imread(r"D:\CDA课件\10月30日 项目1:电商文本挖掘\data\leaf.jpg")
    font = r'C:\Windows\Fonts\simkai.ttf' 
    wc = WordCloud(background_color='white',mask=mask,font_path=font).generate(df)
    plt.figure(figsize=(6,8))
    plt.imshow(wc)
    plt.axis('off')
    plt.show()

写出词云图 

wc.to_file('E:/learn file/data/拜耳舆情词云.png')

 基于TF-IDF 算法的关键词抽取

jieba.analyse.extract_tags(bai64,20,True)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值