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() |
總結
以上是生活随笔為你收集整理的Python—实训day12—汽车用户消费投诉案例-分析及可视化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初探 C# GPU 通用计算技术
- 下一篇: 专访雷果国:从1.5K到18K 一个程序