Python—实训day12—汽车用户消费投诉案例-分析及可视化

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()

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值