Python 数据分析与可视化超详细教程,带你从 0 基础到熟练运用(附安装包)
前言
在数据时代,数据分析与可视化至关重要,Python 因简单强大成数据爱好者首选。
本教程带你开启 Python 数据分析与可视化之旅,从环境搭建到数据处理,将数据变图表。无论小白或能手,都能收获乐趣与知识,一起用 Python 释放数据力量!
一、环境搭建
1. 下载 Python
访问 Python 官方网站,根据你的操作系统(Windows、Mac OS、Linux)选择合适的 Python 版本进行下载。建议下载 Python 3.x 版本,因为 Python 2 已经停止维护。
还可以从小编准备地址下载。
Python 3.7下载地址:https://pan.quark.cn/s/8268bf81f31f
Python 3.9下载地址:https://pan.quark.cn/s/9711a93276ad
Python 3.11下载地址:https://pan.quark.cn/s/9c44793cb24c
2. 安装 Python
访问 Python 官方网站(https://www.python.org/),根据自己的操作系统(Windows、MacOS、Linux)下载并安装 Python 3.x 版本。安装过程中注意勾选 “Add Python to PATH”,以便在命令行中能直接使用 Python。
Python 3.7安装教程:https://blog.csdn.net/u014164303/article/details/145620847
Python 3.9安装教程:https://blog.csdn.net/u014164303/article/details/145570561
Python 3.11安装教程:https://blog.csdn.net/u014164303/article/details/145549489
3. 选择开发环境
下载 PyCharm 社区版(免费)或专业版(需付费或申请教育版)。安装完成后,打开 PyCharm,创建一个新的项目,在项目设置中选择之前创建的虚拟环境作为项目的 Python 解释器。PyCharm 功能强大,提供代码自动补全、调试等功能,适合开发大型项目。
Pycharm安装教程:https://blog.csdn.net/u014164303/article/details/145674773
PyCharm下载地址:https://pan.quark.cn/s/5756c8cf8b2a
4.使用 pip 安装必要的库
在命令提示符中输入以下命令并回车,以安装 Pandas:
pip install pandas numpy matplotlib seaborn scipy scikit-learn statsmodels plotly
- pandas:强大的数据处理和分析库,提供了 DataFrame 和 Series 等数据结构。
- numpy:用于高效的数值计算,是很多科学计算库的基础。
- matplotlib:基础的绘图库,可创建各种静态图表。
- seaborn:基于 matplotlib 的高级可视化库,提供更美观的默认样式。
- scipy:包含许多科学计算相关的工具,如优化、积分、插值等。
- scikit-learn:用于机器学习任务,提供分类、回归、聚类等多种算法。
- statsmodels:用于统计建模和数据分析,提供了多种统计模型。
- plotly:交互式可视化库,可创建动态、可交互的图表。
二、数据读取与预处理
2.1 数据读取
- CSV 文件
import pandas as pd
# 读取 CSV 文件
file_path = 'data.csv'
try:
csv_data = pd.read_csv(file_path)
print("CSV 文件读取成功")
except FileNotFoundError:
print(f"未找到文件: {file_path}")
- Excel 文件
# 读取 Excel 文件
excel_file = pd.ExcelFile('data.xlsx')
# 获取指定工作表中的数据
df = excel_file.parse('Sheet1')
- SQL 数据库
import sqlite3
# 连接到 SQLite 数据库
conn = sqlite3.connect('example.db')
# 执行 SQL 查询
query = 'SELECT * FROM table_name'
sql_data = pd.read_sql(query, conn)
# 关闭数据库连接
conn.close()
- JSON 文件
# 读取 JSON 文件
json_data = pd.read_json('data.json')
2.2 数据查看与基本信息了解
# 查看数据基本信息,包括列名、数据类型、非空值数量等
print(csv_data.info())
# 查看数据集行数,默认显示前 5 行
print(csv_data.head().to_csv(sep='\t', na_rep='nan'))
# 查看数据集行数,指定显示前 10 行
print(csv_data.head(10).to_csv(sep='\t', na_rep='nan'))
# 查看数据的基本统计信息,如均值、标准差、最小值、最大值等
print(csv_data.describe().to_csv(sep='\t', na_rep='nan'))
# 查看数据集行数
rows, columns = csv_data.shape
if rows < 1000:
# 小数据集(行数少于1000)查看全量数据信息
print(csv_data.to_csv(sep='\t', na_rep='nan'))
else:
# 大数据集查看数据前几行信息
print(csv_data.head().to_csv(sep='\t', na_rep='nan'))
2.3 数据清洗
- 处理缺失值
# 删除包含缺失值的行
cleaned_data = csv_data.dropna()
# 用均值填充缺失值
for column in csv_data.columns:
if csv_data[column].dtype in ['int64', 'float64']:
mean_value = csv_data[column].mean()
csv_data[column].fillna(mean_value, inplace=True)
# 用中位数填充缺失值
for column in csv_data.columns:
if csv_data[column].dtype in ['int64', 'float64']:
median_value = csv_data[column].median()
csv_data[column].fillna(median_value, inplace=True)
# 用指定值填充缺失值
csv_data['column_name'].fillna('unknown', inplace=True)
- 处理重复值
# 查找重复值
duplicate_rows = csv_data[csv_data.duplicated()]
# 删除重复值
csv_data = csv_data.drop_duplicates()
- 处理异常值
import numpy as np
# 基于 Z-score 方法检测异常值
z_scores = np.abs((csv_data['numeric_column'] - csv_data['numeric_column'].mean()) / csv_data['numeric_column'].std())
threshold = 3
outliers = csv_data[z_scores > threshold]
# 删除异常值
csv_data = csv_data[z_scores <= threshold]
2.4 数据类型转换
# 将某列转换为日期类型
csv_data['date_column'] = pd.to_datetime(csv_data['date_column'])
# 将某列转换为数值类型
csv_data['numeric_column'] = pd.to_numeric(csv_data['numeric_column'], errors='coerce')
# 将某列转换为字符串类型
csv_data['string_column'] = csv_data['string_column'].astype(str)
2.5 数据编码
- 标签编码
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
csv_data['category_column'] = le.fit_transform(csv_data['category_column'])
- 独热编码
csv_data = pd.get_dummies(csv_data, columns=['category_column'])
三、数据分析
3.1 数据筛选与排序
# 筛选满足条件的数据
filtered_data = csv_data[csv_data['column_name'] > 10]
# 筛选多条件的数据
multi_filtered_data = csv_data[(csv_data['column1'] > 10) & (csv_data['column2'] < 20)]
# 按某列进行排序
sorted_data = csv_data.sort_values(by='column_name', ascending=False)
# 按多列进行排序
multi_sorted_data = csv_data.sort_values(by=['column1', 'column2'], ascending=[True, False])
## 3.2 数据分组与聚合
# 按某列进行分组,并计算每组的均值
grouped_data = csv_data.groupby('category_column')['numeric_column'].mean()
# 进行多列分组,并进行多种聚合操作
aggregated_data = csv_data.groupby(['category_column1', 'category_column2']).agg({
'numeric_column1': ['sum', 'mean'],
'numeric_column2': 'max'
})
3.3 相关性分析
from scipy.stats import pearsonr
# 计算两列的皮尔逊相关系数和 p 值
corr, p_value = pearsonr(csv_data['column1'], csv_data['column2'])
print(f"皮尔逊相关系数: {corr}, p 值: {p_value}")
# 使用 pandas 计算相关系数矩阵
corr_matrix = csv_data.corr()
print(corr_matrix)
# 绘制相关系数矩阵热力图
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.title('相关系数矩阵热力图')
plt.show()
3.4 时间序列分析
# 设置日期列为索引
csv_data.set_index('date_column', inplace=True)
# 按年进行重采样并计算均值
yearly_data = csv_data['numeric_column'].resample('Y').mean()
# 计算移动平均值
rolling_mean = csv_data['numeric_column'].rolling(window=7).mean()
# 绘制时间序列图
plt.figure(figsize=(12, 6))
plt.plot(csv_data['numeric_column'], label='Original Data')
plt.plot(rolling_mean, label='7-Day Rolling Mean')
plt.xlabel('Date')
plt.ylabel('Value')
plt.title('Time Series Analysis')
plt.legend()
plt.show()
3.5 机器学习基础分析(简单示例)
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 准备特征和目标变量
X = csv_data[['feature_column1', 'feature_column2']]
y = csv_data['target_column']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估模型
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(f"均方误差: {mse}")
print(f"均方根误差: {rmse}")
四、数据可视化
4.1 使用 matplotlib 进行基础绘图
- 折线图
import matplotlib.pyplot as plt
# 示例数据
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
# 绘制折线图
plt.plot(x, y, marker='o', linestyle='-', color='b', label='Line Plot')
plt.xlabel('X 轴标签')
plt.ylabel('Y 轴标签')
plt.title('折线图示例')
plt.legend()
plt.grid(True)
plt.show()
- 柱状图
# 示例数据
categories = ['A', 'B', 'C', 'D']
values = [10, 20, 15, 25]
# 绘制柱状图
plt.bar(categories, values, color='g', edgecolor='k')
plt.xlabel('类别')
plt.ylabel('数值')
plt.title('柱状图示例')
plt.show()
- 散点图
# 示例数据
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
# 绘制散点图
plt.scatter(x, y, color='r', marker='s', label='Scatter Plot')
plt.xlabel('X 轴标签')
plt.ylabel('Y 轴标签')
plt.title('散点图示例')
plt.legend()
plt.show()
- 饼图
# 示例数据
labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']
explode = (0, 0.1, 0, 0) # 突出显示第二部分
# 绘制饼图
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal') # 保证饼图是圆形
plt.title('饼图示例')
plt.show()
4.2 使用 seaborn 进行高级可视化
- 箱线图
import seaborn as sns
# 示例数据
tips = sns.load_dataset('tips')
# 绘制箱线图
sns.boxplot(x='day', y='total_bill', data=tips, palette='Set3')
plt.title('箱线图示例')
plt.show()
- 热力图
# 计算相关系数矩阵
corr_matrix = tips.corr()
# 绘制热力图
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', linewidths=0.5)
plt.title('热力图示例')
plt.show()
- 分类散点图(小提琴图)
# 绘制小提琴图
sns.violinplot(x='day', y='total_bill', hue='sex', data=tips, split=True, palette='muted')
plt.title('小提琴图示例')
plt.show()
- 成对关系图
# 绘制成对关系图
sns.pairplot(tips, hue='sex')
plt.title('成对关系图示例')
plt.show()
4.3 使用 plotly 进行交互式可视化
- 交互式折线图
import plotly.express as px
# 示例数据
df = px.data.gapminder().query("country=='Canada'")
fig = px.line(df, x='year', y='lifeExp', title='交互式折线图示例')
fig.show()
- 交互式散点图
df = px.data.iris()
fig = px.scatter(df, x='sepal_width', y='sepal_length', color='species',
size='petal_length', hover_data=['petal_width'],
title='交互式散点图示例')
fig.show()
五、综合案例分析
5.1 电商销售数据分析与可视化
- 背景:某电商平台记录了一段时间内不同商品的销售数据,包括商品名称、销售数量、销售金额、销售日期等信息。我们将通过分析这些数据,了解销售趋势、商品销售情况等,并进行可视化展示。
- 代码实现:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 读取数据
data = pd.read_csv('ecommerce_sales.csv')
# 将销售日期转换为日期类型
data['sales_date'] = pd.to_datetime(data['sales_date'])
# 按日期统计总销售金额
daily_sales = data.groupby('sales_date')['sales_amount'].sum()
# 绘制每日销售金额折线图
plt.figure(figsize=(12, 6))
plt.plot(daily_sales.index, daily_sales.values)
plt.title('Daily Sales Amount')
plt.xlabel('Date')
plt.ylabel('Sales Amount')
plt.xticks(rotation=45)
plt.show()
# 统计不同商品的销售数量和销售金额
product_sales = data.groupby('product_name').agg({'sales_quantity': 'sum', 'sales_amount': 'sum'})
# 绘制不同商品销售数量柱状图
plt.figure(figsize=(10, 6))
sns.barplot(x=product_sales.index, y=product_sales['sales_quantity'])
plt.title('Sales Quantity by Product')
plt.xlabel('Product Name')
plt.ylabel('Sales Quantity')
plt.xticks(rotation=90)
plt.show()
# 绘制销售数量和销售金额的散点图
plt.figure(figsize=(8, 6))
plt.scatter(product_sales['sales_quantity'], product_sales['sales_amount'])
plt.title('Relationship between Sales Quantity and Sales Amount')
plt.xlabel('Sales Quantity')
plt.ylabel('Sales Amount')
plt.show()
- 解释:
首先,使用 pandas 读取电商销售数据,并将销售日期转换为日期类型,方便后续按日期进行统计。
然后,按日期分组计算每日的总销售金额,并使用 matplotlib 绘制折线图,直观展示销售金额随时间的变化趋势。
接着,按商品名称分组统计不同商品的销售数量和销售金额,使用 seaborn 绘制不同商品销售数量的柱状图,对比各商品的销售情况。
最后,绘制销售数量和销售金额的散点图,观察两者之间的关系。
5.2 电影评分数据分析与可视化
- 背景:我们有一份电影评分数据集,包含电影名称、评分、上映年份、类型等信息。通过对这些数据进行分析和可视化,我们可以了解不同年份电影评分的分布、不同类型电影的受欢迎程度等。
- 代码实现:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 读取数据
data = pd.read_csv('movie_ratings.csv')
# 按上映年份统计平均评分
yearly_ratings = data.groupby('release_year')['rating'].mean()
# 绘制不同年份平均评分折线图
plt.figure(figsize=(12, 6))
plt.plot(yearly_ratings.index, yearly_ratings.values)
plt.title('Average Movie Rating by Year')
plt.xlabel('Release Year')
plt.ylabel('Average Rating')
plt.xticks(rotation=45)
plt.show()
# 统计不同类型电影的数量
genre_counts = data['genre'].value_counts()
# 绘制不同类型电影数量柱状图
plt.figure(figsize=(10, 6))
sns.barplot(x=genre_counts.index, y=genre_counts.values)
plt.title('Number of Movies by Genre')
plt.xlabel('Genre')
plt.ylabel('Number of Movies')
plt.xticks(rotation=90)
plt.show()
# 绘制评分的直方图
plt.figure(figsize=(8, 6))
sns.histplot(data['rating'], bins=10, kde=False)
plt.title('Distribution of Movie Ratings')
plt.xlabel('Rating')
plt.ylabel('Frequency')
plt.show()
- 解释:
读取电影评分数据后,按上映年份分组计算平均评分,并使用 matplotlib 绘制折线图,展示不同年份电影平均评分的变化。
统计不同类型电影的数量,使用 seaborn 绘制柱状图,对比各类型电影的数量。
绘制评分的直方图,直观呈现电影评分的分布情况。
5.3 股票数据分析与可视化
- 背景:我们获取了某只股票一段时间内的开盘价、收盘价、最高价、最低价等数据。通过对这些数据进行分析和可视化,我们可以了解股票价格的波动情况、计算收益率等。
- 代码实现:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 读取数据
data = pd.read_csv('stock_prices.csv')
# 将日期转换为日期类型
data['date'] = pd.to_datetime(data['date'])
# 设置日期为索引
data.set_index('date', inplace=True)
# 绘制股票收盘价折线图
plt.figure(figsize=(12, 6))
plt.plot(data['close_price'])
plt.title('Stock Closing Price')
plt.xlabel('Date')
plt.ylabel('Closing Price')
plt.xticks(rotation=45)
plt.show()
# 计算每日收益率
data['daily_return'] = data['close_price'].pct_change()
# 绘制每日收益率直方图
plt.figure(figsize=(8, 6))
sns.histplot(data['daily_return'].dropna(), bins=20, kde=False)
plt.title('Distribution of Daily Returns')
plt.xlabel('Daily Return')
plt.ylabel('Frequency')
plt.show()
# 计算移动平均线(5 日和 20 日)
data['ma_5'] = data['close_price'].rolling(window=5).mean()
data['ma_20'] = data['close_price'].rolling(window=20).mean()
# 绘制收盘价和移动平均线折线图
plt.figure(figsize=(12, 6))
plt.plot(data['close_price'], label='Closing Price')
plt.plot(data['ma_5'], label='5-Day Moving Average')
plt.plot(data['ma_20'], label='20-Day Moving Average')
plt.title('Stock Closing Price and Moving Averages')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.xticks(rotation=45)
plt.show()
- 解释:
读取股票价格数据后,将日期转换为日期类型并设置为索引。
绘制股票收盘价的折线图,直观展示股票价格随时间的变化。
计算每日收益率,并绘制收益率的直方图,了解收益率的分布情况。
计算 5 日和 20 日的移动平均线,并将收盘价和移动平均线绘制在同一张图上,观察价格与均线的关系。