1数据预处理
1.1读取数据,查看数据形状,数据类型
#------------1.1读取数据,查看数据形状,数据类型-------------------- import pandas as pd data = pd.read_excel(r'F:\Desktop\汽车用户消费投诉数据.xlsx') data.head() data_shape = data.shape #(75423, 8) data.dtypes #查看数据类型 |
1.2检测缺失值、重复值并处理
#------------1.2检测缺失值、重复值并处理-------------------- #----检查缺失值 data.isnull().sum() #可忽略也可以采用删除法删除对应的那两行数据 a = data.loc[data['投诉内容'].isnull(), :] #----删除法处理缺失值 data.dropna(axis=0, how='any', inplace=True) null_shape = data.shape #(75421, 8),删除了两行数据 print('总共删除了',data_shape[0]-null_shape[0],'行数据。') #----重复值的检测及处理 data.drop_duplicates(inplace=True) wuchongfu_shape = data.shape #(75408, 8),删除了13行数据 print('总共删除了',null_shape[0]-wuchongfu_shape[0],'行重复数据') |
1.3对各列进行处理
将“Unnamed: 0”一列进行删除。(没有分析意义)
“单号”一列将“单号:”去除,并转换为“int”类型。
“品牌车型”一列将“品牌车型:”去除。
“投诉时间”一列将“投诉时间:”去除,并转换为标准时间格式。
“经销商”一列将“经销商:”去除。
“诉求问题”一列将“诉求问题:”去除。
#data['单号'][0].replace('单号:', '') #'aabb'.replace('aa', '') #------------1.3对各列进行处理-------------------- #----将“Unnamed: 0”一列进行删除。(没有分析意义) data.drop('Unnamed: 0', axis=1, inplace=True) data.shape #(75408, 7),删除了一个列 #----“单号”一列将“单号:”去除,并转换为“int”类型。 ##--第一张方法:使用int函数 data['单号'] = data['单号'].apply(lambda x:int(x.replace('单号:', ''))) data.dtypes ##--第二种方法:使用astype方法 # data['单号'] = data['单号'].apply(lambda x:x.replace('单号:', '')) # data['单号'] = data['单号'].astype('int') # data.dtypes #----“品牌车型”一列将“品牌车型:”去除。 data['品牌车型'] = data['品牌车型'].apply(lambda x:x.replace('品牌车型:', '')) #----“投诉时间”一列将“投诉时间:”去除,并转换为标准时间格式。 data['投诉时间'] = data['投诉时间'].apply(lambda x:x.replace('投诉时间:', '')) data.dtypes data['投诉时间'] = pd.to_datetime(data['投诉时间']) data.dtypes #----“经销商”一列将“经销商:”去除。 data['经销商'] = data['经销商'].apply(lambda x:x.replace('经销商:', '')) #----“诉求问题”一列将“诉求问题:”去除。 data['诉求问题'] = data['诉求问题'].apply(lambda x:x.replace('诉求问题:', '')) |
1.4重置索引
#------------1.4重置索引-------------------- ##--第一种方法:调用index属性 #data.index = range(len(data)) ##第二种方法:使用reset_index方法 data.reset_index(drop=True, inplace=True) #drop=True将原始索引进行删除操作 |
2数据可视化分析
2.1历年投诉数量统计
2.1.1绘制柱状图呈现不同年份的投诉情况
#----2.1.1绘制柱状图呈现不同年份的投诉情况 #构建新列“year”(提取“投诉时间”中的年份数据) ##--第一种方法 #data['year'] = data['投诉时间'].apply(lambda x:x.year) ##--第二种方法 data['year'] = data['投诉时间'].dt.year #统计各个年份的投诉数量 year_tousu = data.groupby(by='year').agg({'投诉时间':'count'}) #绘制柱状图 ##--第一种方法:使用pyecharts绘制 from pyecharts.charts import Bar bar = Bar() bar.add_xaxis(xaxis_data=list(year_tousu.index)) #添加x轴数据 bar.add_yaxis(series_name='投诉数量', y_axis=list(year_tousu['投诉时间'])) #添加y轴数据 bar.render(r'F:\Desktop\a.html') ##--第二种方法:使用matplotlib绘制 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = 'SimHei' #正常显示中文 plt.rcParams['axes.unicode_minus'] = False #正常显示符号 plt.bar(range(len(year_tousu)), year_tousu['投诉时间']) plt.xticks(range(len(year_tousu)), year_tousu.index) plt.title('不同年份的投诉数量') plt.xlabel('年份') plt.ylabel('投诉数量') plt.show() #绘制不同年份投诉数量及年环比增长率(双Y轴图像) t = year_tousu.diff().iloc[1:,:] #年增长的投诉数量 t.index = year_tousu.index[:-1] num = t/year_tousu #投诉数量年环比增长率 fig = plt.figure(figsize=(6,4)) ax = fig.add_subplot(1, 1, 1) ax.bar(year_tousu.index, year_tousu['投诉时间']) ax.set_xlabel('年份') ax.set_ylabel('投诉数量') ax.set_title('不同年份投诉数量及年环比增长率') plt.xticks(year_tousu.index, year_tousu.index) #设置x轴刻度 ax2 = ax.twinx() #两个子图公用x轴 ax2.plot(num.index[2:], num.iloc[1:-1, 0], c='r') ax2.set_ylabel('年环比增长率') plt.show() #显示图形 |
2.1.2绘制折线图呈现投诉数量随日期的变化情况
#----2.1.2绘制折线图呈现投诉数量随日期的变化情况 #构建新列“date”(提取“投诉时间”中的日期数据) data['date'] = data['投诉时间'].dt.date #统计各日期下的投诉数量 num = data.groupby(by='date').agg({'投诉时间':'count'}) num.columns = ['投诉数量'] #更改列名 plt.plot(range(len(num)), num['投诉数量']) plt.xticks(range(0, len(num), 100), num.index[::100],rotation=90) #设置x轴刻度 plt.xlabel('日期') plt.ylabel('投诉数量') plt.title('投诉数量随日期的变化情况') plt.show() |
2.1.3绘制热力图呈现不同年份不同月份的投诉情况
#新建一列“month”(提取“投诉时间”中的月份数据) data['month'] = data['投诉时间'].dt.month #统计各年份各月份的投诉数量 num = pd.pivot_table(data[['year','month','投诉时间']], index='year', columns='month', values='投诉时间', aggfunc='count') num.fillna(0, inplace=True) #填补缺失值 num.max().max() #2873.0 num.median().median() #605.0 from pyecharts.charts import HeatMap import pyecharts.options as opts values = [(i, j, num.values[i,j]) for i in range(10) for j in range(12)] #热力图 heatmap = HeatMap() heatmap.add_xaxis(xaxis_data=[2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020]) heatmap.add_yaxis(series_name='投诉数量', yaxis_data=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], value=values, label_opts=opts.LabelOpts(is_show=True, position='inside')) heatmap.set_global_opts(title_opts=opts.TitleOpts(title='不同年份不同月份的投诉情况'), visualmap_opts=opts.VisualMapOpts(min_=200, max_=3000), #视觉映射配置 xaxis_opts=opts.AxisOpts(name='年份', name_location='middle'), #设置x轴标签 yaxis_opts=opts.AxisOpts(name='月份', name_location='middle'), #设置x轴标签 ) heatmap.render(r'F:\Desktop\a.html') |
#提取2018年3月份数据 tousu_max = data.loc[(data['year']==2018) & (data['month']==3), :] #统计2018年3月各品牌车型的投诉数量 tousu_max['品牌车型'].value_counts() #提取2018年3月份品牌车型为“本田CR-V”的数据 tousu_max.loc[data['品牌车型']=='本田CR-V', :] |
2.2投诉问题
import jieba from tkinter import _flatten from wordcloud import WordCloud jieba.load_userdict(r'F:\Desktop\newdir.txt') #加载自定义词库 #分词 content_cut = data['投诉内容'].apply(lambda x:jieba.lcut(str(x))) #导入停用词 with open(r'F:\Desktop\stoplist.txt', 'r', encoding='utf-8') as f: stop = f.read().split() stop = stop + [' ','\n'] #过滤词 content_after = content_cut.apply(lambda x:[i for i in x if i not in stop]) #数据展平及频数统计 ci_counts = pd.Series(_flatten(list(content_after))).value_counts() ci_counts #绘制词云图 pic = plt.imread(r'F:\Desktop\aixin.jpg') #加载图片 wc = WordCloud(mask=pic, font_path=r'C:\Windows\Fonts\simsun.ttc', background_color='white') #mask设置背景图片,background_color设置背景颜色 wc.fit_words(ci_counts[:200]) #添加数据 plt.axis('off') #设置不显示坐标尺寸 plt.imshow(wc) #接收一张图像,只是画出该图 plt.show() |
2.3不同品牌的投诉情况
#----2.3.1品牌投诉排行榜 pinpai = data['品牌'].value_counts() plt.bar(range(10), pinpai[:10]) plt.xticks(range(10), pinpai.index[:10], rotation=90) plt.title('品牌投诉排行榜') plt.show() |