地摊经济数据集分析 – 分词+聚类+词云
背景描述
地摊经济,是指通过摆地摊获得收入来源而形成的一种经济形式。地摊经济是城市的一种边缘经济,一直是影响市容环境的关键因素,但地摊经济有其独特优势,在金融危机背景下能一定程度上缓解就业压力。
2020年5月27日,中央文明办明确,在2020年全国文明城市测评指标中不将马路市场、流动商贩列为文明城市测评考核内容 。6月1日上午,国务院总理李克强在山东烟台考察时表示,地摊经济、小店经济是就业岗位的重要来源,是人间的烟火,和“高大上”一样,是中国的生机。
数据说明
数据列说明
列名 | 说明 |
---|---|
url | 网址 |
danmu_infos | 弹幕信息 |
danmu_text | 弹幕文本内容 |
主要内容
1、 对无用的数据进行整理
2、 用正确的方式完成数据清洗
3、 对弹幕文本内容进行合理分词
4、 根据分词结果建立词向量完成聚类,根据聚类结果形成词云,对于人们的评论观点进行分析
配置及代码核心实现
数据预处理
数据预处理:将未加工数据转换成适合分析的形式,包括多数据源的数据融合、数据清洗、维规约等等。为什么要进行预处理:原始数据普遍存在问题,必须加以处理才能用于分析,一方面要提高数据质量,另一方面为了更好的使数据适应特定的数据挖掘技术及工具。
(1)导入库、读取数据
import pandas as pd
import numpy as np
from sklearn import ensemble
df = pd.read_csv('成都地摊的经济与文化-B站弹幕.csv')
df.head() #查看部分数据
(2)数据空值,重复值处理
# 查看重复值
df.duplicated()
#统计重复着个数
df.duplicated().sum()
#空值处理,把空值用空格符代替
df.fillna(' ')
(3)把submit_time分割获取更多的数据,方便进行后面的任务
import time
# 定义转换时间
def transform_timestamp(time_second):
timeArray = time.gmtime(time_second)
otherStyleTime = time.strftime('%Y-%m-%d %H:%M:%S', timeArray)
return otherStyleTime
# 提取时间,把submit_time用split进行分割,获取x[4],然后进行时间转换,然后重新创建submit_time标签
df['submit_time'] = df['danmu_infos'].str.split(',').apply(lambda x:x[4])
df['submit_time'] = df['submit_time'].astype('int').apply(lambda x: transform_timestamp(x))
# 提取日期,把submit_time用split进行分割,获取x[0],然后进行时间转换,然后重新创建submit_date和submit_hour标签
df['submit_date'] = df['submit_time'].str.split(' ').apply(lambda x:x[0])
df['submit_hour'] = df['submit_time'].str.split(' ').apply(lambda x:x[1]).str.split(':').apply(lambda x:x[0])
# 提取发送时间点,把submit_time用split进行分割,获取x[0],然后进行时间转换,然后重新创建send_point_2,send_point标签
df['send_point'] = df['danmu_infos'].str.split(',').apply(lambda x:x[0])
df['send_point_2'] = df['send_point'].astype('float').astype('int')
df['send_point_2'] = df['send_point_2'].apply(lambda x: str(x//60)+':'+str(x%60))
df.head(5)
(4)删除’url’,'danmu_infos’2个无用的标签
df = df.drop(['url','danmu_infos'], axis=1)
df.head(5)
文本分词
分词(tokenization):将每个文档划分为出现在其中的单词[(token)],比如按空格和标点划分。
(1)处理评论内容,提取有用的弹幕评论信息,并进行分词
#定义删除除字母,数字,汉字以外的所有符号的函数
def remove_punctuation(line):
line = str(line)
if line.strip() == '':
return ''
rule = re.compile(u"[^a-zA-Z0-9\u4E00-\u9FA5]")
line = rule.sub('', line)
return line
#停用词
def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf8').readlines()]
return stopwords
# 加载停用词
stopwords = stopwordslist("baidu_stopwords.txt")
#去除标点符号
df['danmu_text']=df['danmu_text'].apply(remove_punctuation)
#去除停用词
df['danmu_text']=df['danmu_text'].apply(lambda x:" ".join([w for w in list(jieba.cut(x)) if w not in stopwords]))
#删除数字,把全是数字的变成空格符
for i in range(len(df)):
if str(df['danmu_text'][i]).isdigit()==True:
df['danmu_text'][i]=" "
df
聚类+词云
K-means 聚类分析算法又称群分析,它是研究(样品或指标)分类问题的一种多元统计方法,所谓类就是指相似元素的集合。
聚类(Clustering):是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。也即聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。相似的数据划分到一起,具体划分的时候并不关心这一类的标签,目标就是把相似的数据聚合到一起,聚类是一种无监督学习(Unsupervised Learning)方法。
(1)把分词好的弹幕评论内容进行词向量的转化
from sklearn.feature_extraction.text import CountVectorizer#词袋
from sklearn.feature_extraction.text import TfidfTransformer#tfidf
#词向量转换
count_vect = CountVectorizer()
X = count_vect.fit_transform(df['danmu_text'])
#tf-idf
tfidf_transformer = TfidfTransformer()
X_tfidf = tfidf_transformer.fit_transform(X)
print(X_tfidf)
(2)用SSE画出K值的图,用来选择最优的K值
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# '利用SSE选择k'
SSE = [] # 存放每次结果的误差平方和
for k in range(1, 9):
estimator = KMeans(n_clusters=k) # 构造聚类器
estimator.fit(X_tfidf)
SSE.append(estimator.inertia_)
X = range(1, 9)
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(X, SSE, 'o-')
plt.show()
(3)创建kmeans模型,传入词向量进行训练
# K均值聚类
model_kmeans = KMeans(n_clusters=8,random_state=1) # 创建聚类模型对象
model_kmeans.fit(X_tfidf) # 训练模型
# 聚类结果
cluster_labels = model_kmeans.labels_ # 聚类标签结果
print(cluster_labels)
(4)把聚类生成的结果与danmu_text对应
#结果拼接
labels=pd.DataFrame(cluster_labels,columns=['标签'])
shuju=pd.concat([df['danmu_text'],labels],axis=1)
print(shuju)
(5)查看部分类别的词汇
cat_desc = dict()
biaoqian_values=[0,1,2,3,4,5,6]#聚类标签
for i in biaoqian_values:
text = shuju.loc[shuju['标签'] == i, 'danmu_text']
text = (' '.join(map(str, text))).split(' ')
cat_desc[i] = text
print(cat_desc[2])#打印2类词汇
(6)把聚类产生的结果,然后统计词频,可以画出词云图,方便进行分析
#词云图
#查看词云
from collections import Counter
from wordcloud import WordCloud
def generate_wordcloud(tup):
wordcloud = WordCloud(background_color='white',
font_path='simhei.ttf',
max_words=50, max_font_size=40,
random_state=42
).generate(str(tup))
return wordcloud
fig, axes = plt.subplots(4, 2, figsize=(30, 38))
k = 0
for i in range(4):
for j in range(2):
most10 = Counter(cat_desc[k]).most_common(10)#10个高频词
ax = axes[i, j]
ax.imshow(generate_wordcloud(most10), interpolation="bilinear")
ax.axis('off') #坐标视为不可见,但坐标系的title视为可见.
ax.set_title("{} Top 10".format(k), fontsize=30)
if k<6:
k += 1
plt.show()