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

本文通过预处理汽车用户消费投诉数据,包括缺失值处理、数据类型转换等步骤,利用柱状图、折线图和热力图等多种图表形式进行数据可视化分析,展示了不同年份和月份的投诉趋势,并对投诉内容进行了文本挖掘。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

数据分析综合项目实训课程旨在通过实践帮助学员掌握数据处理、可视化及建模的核心技能。下面是一个简单的自创项目实例——**“电商平台销售数据分析”**。 --- ### **项目背景** 某电商平台上记录了大量商品销售信息,包括用户购买行为、商品类别、销售额等数据。作为数据分析师,你需要对这些数据进行清洗、分析,并生成有价值的洞察报告。 --- ### **项目目标** 1. 清洗并整理原始数据。 2. 分析用户的购物习惯和趋势。 3. 提供针对平台优化运营的建议。 --- ### **所需工具和技术** - 编程语言:Python 或 R - 工具库: - Pandas(用于数据处理) - Matplotlib 和 Seaborn(用于数据可视化- Numpy(辅助数值计算) - 数据来源:可以使用公开数据集(如Kaggle上的E-commerce Dataset),也可以模拟生成数据。 --- ### **项目步骤** #### **1. 数据获取** 从指定的数据源下载CSV文件或其他格式的原始数据。假设数据包含以下字段: - `OrderID` (订单编号) - `CustomerID` (户编号) - `ProductCategory` (产品分类) - `SalesAmount` (销售金额) - `PurchaseDate` (购买日期) 如果无现成数据,可以用Python随机生成一些虚拟数据: ```python import pandas as pd import numpy as np # 随机创建示例数据 data = { 'OrderID': range(1, 501), 'CustomerID': np.random.randint(1, 101, size=500), # 模拟顾ID 'ProductCategory': np.random.choice(['Electronics', 'Clothing', 'Books'], size=500), # 商品分类 'SalesAmount': np.round(np.random.uniform(10, 1000, size=500)), # 销售额 'PurchaseDate': pd.date_range('2023-01-01', periods=500).tolist() # 购买时间戳 } df = pd.DataFrame(data) print(df.head()) ``` #### **2. 数据清洗** 检查是否存在缺失值、重复行或异常值。例如: - 删除无效数据(比如负数销售额); - 填补空缺项(如果有明确规则的话); - 格式化日期列以便后续操作。 ```python # 示例:删除有错误的销售额记录 df_cleaned = df[df['SalesAmount'] > 0] ``` #### **3. 探索性数据分析(EDA)** 利用统计图表总结关键指标: - 各类产品销量占比饼图; - 时间序列上总销售收入变化曲线; - 热销Top-N产品的柱状分布图。 ```python import matplotlib.pyplot as plt import seaborn as sns # 绘制各类别销售额比例 category_sales = df.groupby('ProductCategory')['SalesAmount'].sum() plt.pie(category_sales.values, labels=category_sales.index, autopct='%1.1f%%') plt.title("各品类销售占比") plt.show() # 查看每日收入走势 df['Day'] = df['PurchaseDate'].dt.strftime('%Y-%m-%d') daily_income = df.groupby('Day')['SalesAmount'].sum().reset_index() sns.lineplot(x='Day', y='SalesAmount', data=daily_income) plt.xticks(rotation=45) plt.tight_layout() plt.title("每天总收入变化趋势") plt.show() ``` #### **4. 构建模型(可选部分)** 根据需求建立预测模型或推荐系统。例如: - 使用回归算法估算未来一个月内的潜在收益; - 运用聚类技术将用户分群以制定个性化营销策略。 #### **5. 结果展示与结论撰写** 制作简洁明了的专业PPT汇报文档或者Jupyter Notebook形式交付成果。内容应涵盖但不限于以下几个方面: - 发现的主要规律有哪些? - 平台目前存在的问题是什么? - 下一步改进建议具体如何实施? --- ### **学习收获** 完成本案例后,学生能够熟练运用以下知识要点: - 数据加载与预处理技巧; - 可视化表达复杂关系的能力; - 商业场景下的实际应用思维训练; --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值