新能源汽车产销数据分析

发布于:2024-12-21 ⋅ 阅读:(11) ⋅ 点赞:(0)


一、读取数据

安装必要的库(如果未安装):

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

在这里插入图片描述


三、建议


网站公告

今日签到

点亮在社区的每一天
去签到