新能源汽车产销数据分析
一、读取数据
安装必要的库(如果未安装):
pip install pandas openpyxl
其中 pandas
用于数据操作。openpyxl
用于读取 .xlsx 文件。
import pandas as pd
# 读取 Excel 文件
file_path = "./dataset/data.xlsx"
data = pd.read_excel(file_path)
1.打印表头信息
print("表头信息:\n", data.columns)
表头信息:
Index(['序号', '统计类型', '制造厂', '车型', '车型大类', '数据日期', '当期值(辆)', '累计值(辆)',
'去年同期累计值(辆)', '当期同比(%)', '当期环比(%)', '累计同比(%)', '市占率(%)'],
dtype='object')
2.查看前几行数据
print("\n数据前几行:")
print(data.head())
数据前几行:
序号 统计类型 制造厂 车型 ... 当期同比(%) 当期环比(%) 累计同比(%) 市占率(%)
0 1.0 产量 特斯拉(上海) Model3(BEV) ... 0.00 -5.94 0.00 1.38
1 2.0 销量 特斯拉(上海) Model3(BEV) ... 0.00 34.78 0.00 1.24
2 3.0 销量 比亚迪 秦(BEV) ... 61.90 38.25 117.63 0.63
3 4.0 产量 比亚迪 秦(BEV) ... 52.50 38.32 123.33 0.64
4 5.0 销量 一汽丰田 卡罗拉(HEV) ... 154.05 97.49 -35.98 0.56
[5 rows x 13 columns]
3.打印数据基本统计信息
print("\n数据统计信息:")
print(data.describe())
其中,统计指标的含义
count
: 数据的非空值数量。 表示每列中实际记录的非缺失值数量。缺失值(如 NaN)不会计入。
例如,"序号"列有 30145 条记录,"累计同比(%)"列有 25376 条有效数据。
mean
: 平均值。 每列数据的算术平均值。例如,“当期值(辆)”的平均值是 962.2,表示记录的车辆数平均为 962 辆。
std
: 标准差。 描述数据分布的离散程度。值越大,数据越分散。例如,“市占率(%)”的标准差是 0.497,表示市占率数据有较大的离散性。
min
: 最小值。 数据中的最小值。例如,“当期值(辆)”的最小值是 -991,可能表示一个异常值(如退货或修正数据)。
25%
(1/4 分位数):数据按从小到大排序后,前 25% 数据的最大值。 例如,“当期值(辆)”的 25% 分位数是 0,表示四分之一的记录当期值为 0 或更低。
50%
(中位数):数据按从小到大排序后,中间值。 例如,“当期值(辆)”的中位数是 50,表示一半的记录当期值在 50 辆及以下。
75%
(3/4 分位数):数据按从小到大排序后,前 75% 数据的最大值。 例如,“当期值(辆)”的 75% 分位数是 679,表示四分之三的记录当期值为 679 辆及以下。
max
: 最大值。 数据中的最大值。例如,“当期值(辆)”的最大值是 62640,表示某记录的当期值为 62640 辆。
数据统计信息:
序号 当期值(辆) ... 累计同比(%) 市占率(%)
count 30145.000000 30143.000000 ... 25376.000000 30144.000000
mean 242.861868 962.198421 ... -2.988029 0.130589
std 172.686269 2990.651372 ... 106.949501 0.496897
min 1.000000 -991.000000 ... -446.670000 0.000000
25% 98.000000 0.000000 ... -90.692500 0.000000
50% 212.000000 50.000000 ... 0.000000 0.010000
75% 364.000000 679.000000 ... 0.000000 0.080000
max 766.000000 62640.000000 ... 500.000000 13.020000
[8 rows x 8 columns]
4.检查缺失值情况
print("\n缺失值统计:")
print(data.isnull().sum())
缺失值统计:
序号 165
统计类型 165
制造厂 165
车型 165
车型大类 165
数据日期 165
当期值(辆) 167
累计值(辆) 166
去年同期累计值(辆) 167
当期同比(%) 5140
当期环比(%) 3811
累计同比(%) 4934
市占率(%) 166
dtype: int64
5.缺失值处理方法
# 直接删除对应行
data_cleaned = data.dropna()
二、绘图
安装依赖库:
pip install matplotlib seaborn pandas
导入库基础库并加载数据:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import rcParams
# 设置字体为 SimHei (黑体)
rcParams['font.sans-serif'] = ['SimHei'] # Windows: SimHei; macOS: PingFang SC/Songti SC
rcParams['axes.unicode_minus'] = False # 正常显示负号
# 读取 Excel 文件
file_path = "./dataset/data.xlsx"
data = pd.read_excel(file_path)
1.统计"车型大类"的分布
category_counts = data['车型大类'].value_counts()
# 绘制饼图
plt.figure(figsize=(8, 6))
category_counts.plot.pie(autopct='%1.1f%%', startangle=45, colors=sns.color_palette("pastel"), fontsize=15)
plt.title("车型大类分布", fontsize=20)
plt.ylabel("") # 去掉默认的Y轴标签
plt.show()
2.制造厂累计销量对比(前90%)
# 删除包含缺失值的行
data_cleaned = data.dropna()
# 统计每个制造厂的累计销量
factory_sales = data_cleaned.groupby('制造厂')['累计值(辆)'].sum()
# 按累计值排序,并计算累计百分比
factory_sales_sorted = factory_sales.sort_values(ascending=False)
cumulative_percentage = factory_sales_sorted.cumsum() / factory_sales_sorted.sum()
# 筛选前30%的数据
top_30_percent = factory_sales_sorted[cumulative_percentage <= 0.9]
# 检查是否有数据满足条件
if top_30_percent.empty:
print("没有满足筛选条件的数据。")
else:
# 绘制柱状图
plt.figure(figsize=(10, 6))
top_30_percent.plot(kind='bar', color='skyblue')
plt.title("制造厂累计销量对比(前90%)")
plt.xlabel("制造厂")
plt.ylabel("累计值(辆)")
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
3.当期销量随时间变化折线图
# 删除包含缺失值的行
data_cleaned = data.dropna()
# 确保数据日期列是日期类型
data_cleaned['数据日期'] = pd.to_datetime(data_cleaned['数据日期'])
# 按日期统计当期值总和
date_sales = data_cleaned.groupby('数据日期')['当期值(辆)'].sum().sort_values(ascending=False)
# 计算前30%累计比例
cumulative_percentage = date_sales.cumsum() / date_sales.sum()
top_30_percent = date_sales[cumulative_percentage <= 1.0]
# 绘制折线图
plt.figure(figsize=(12, 6))
top_30_percent.plot(color='blue', marker='o', linestyle='-')
plt.title("当期销量随时间变化")
plt.xlabel("数据日期")
plt.ylabel("当期值(辆)")
plt.grid()
plt.tight_layout()
plt.show()
4.累计同比分布箱线图
import seaborn as sns
# 绘制箱线图
plt.figure(figsize=(8, 6))
sns.boxplot(data=data_cleaned, x='累计同比(%)', color='lightblue')
plt.title("累计同比分布及异常值")
plt.xlabel("累计同比(%)")
plt.tight_layout()
plt.show()
5.当期同比直方图
# 绘制直方图
plt.figure(figsize=(8, 6))
sns.histplot(data=data_cleaned, x='当期同比(%)', bins=30, kde=True, color='orange')
plt.title("当期同比分布")
plt.xlabel("当期同比(%)")
plt.ylabel("频率")
plt.tight_layout()
plt.show()
6.当期环比随时间变化折线图
# 按日期统计当期环比的平均值
date_monthly = data_cleaned.groupby('数据日期')['当期环比(%)'].mean().sort_values(ascending=False)
# 绘制折线图
plt.figure(figsize=(12, 6))
date_monthly.plot(color='green', marker='s', linestyle='--')
plt.title("当期环比随时间变化")
plt.xlabel("数据日期")
plt.ylabel("当期环比(%)")
plt.grid()
plt.tight_layout()
plt.show()
7.累计值与去年同期累计值对比
compare_sales = data_cleaned[['累计值(辆)', '去年同期累计值(辆)']].sum().sort_values(ascending=False)
# 绘制柱状图
plt.figure(figsize=(8, 6))
compare_sales.plot(kind='bar', color=['skyblue', 'orange'])
plt.title("累计值与去年同期累计值对比")
plt.xlabel("类别")
plt.ylabel("车辆数量")
plt.tight_layout()
plt.show()