freeCodeCamp.org

How to Build a Simple Data Analyzer in Python with Pandas

8.5内容质量
How to Build a Simple Data Analyzer in Python with Pandas

TL;DR · AI 摘要

本文提供了一个使用Python和Pandas构建简单数据分析师的教程,适合初学者入门数据分析。

核心要点

  • 使用Pandas的read_csv函数加载CSV数据集
  • 通过describe()方法生成统计摘要
  • Matplotlib可创建基础数据可视化图表

结构提纲

按章节快速跳转。

  1. 揭示数据分析入门无需复杂算法,Python即可完成基础分析任务。

  2. 需安装Python 3、pandas和Matplotlib库并验证安装。

  3. 构建包含12条学生记录的CSV文件作为分析样本。

  4. 涵盖数据加载、统计计算、数据过滤和分组操作。

  5. 使用Matplotlib生成基础数据图表。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • 构建数据分析师教程
    • 环境设置
      • 安装Python/pandas/Matplotlib
    • 数据处理流程
      • 数据加载
      • 统计分析
      • 数据可视化
    • 实践案例
      • 学生绩效数据集分析

金句 / Highlights

值得收藏与分享的关键句。

#Python#Pandas#数据可视化#数据分析
打开原文
Image 1: How to Build a Simple Data Analyzer in Python with Pandas
Image 1: How to Build a Simple Data Analyzer in Python with Pandas

数据分析在初次接触时可能会显得复杂。你可能会想象到大型数据库、高级数学和复杂的机器学习算法。

但许多有用的数据分析任务其实始于更简单的内容:加载数据集、提出问题,并使用 Python 寻找答案。

在本教程中,你将使用 Python 和 Pandas 构建一个简单的数据分析师。你将使用一个虚构的学生表现数据集,并学习如何加载数据、检查数据、计算统计信息、筛选记录、分组信息以及创建基本可视化。

到教程结束时,你将拥有一个可用于分析多种类型 CSV 数据集的可复用基础。

先决条件

在跟随本教程之前,你应该准备好一些基本的 Python 技能和工具。你不需要有高级编程或数据分析经验,但应该熟悉以下内容:

  • Python 变量和基本数据类型,如字符串和数字。
  • 导入库和调用函数。
  • 使用列表和对数据进行基本操作。

如果你是 Python 新手,建议在继续之前先学习这些基础知识。如果你想深入学习,这里有一个交互式 Python 课程可以帮助你入门。

此外,请确保已安装以下内容:

  • Python: Python 3 或兼容的 Python 安装。
  • pandas: 我们将使用的 Python 库,用于加载、筛选、分组和分析数据。
  • Matplotlib: 我们将使用的库,用于创建可视化图表。
  • 代码编辑器或 IDE: 如 VS Code、PyCharm 或简单文本编辑器,以及终端访问权限。

你可以通过在终端中运行以下命令安装 pandas 和 Matplotlib:

code
pip install pandas matplotlib

你还需要一个文件夹来保存 Python 脚本和本教程中将创建的 students.csv 数据集。

一切准备就绪后,你就可以使用 Python 开始分析数据了!

我们将涵盖的内容:

设置环境

安装 pandas

如果你尚未安装 pandas,请打开终端并运行:

code
pip install pandas matplotlib

我们将使用 pandas 进行数据分析,使用 Matplotlib 创建简单可视化。

你可以通过以下代码验证安装:

code
import pandas as pd
import matplotlib.pyplot as plt

print(pd.__version__)

如果 Python 输出版本号,说明你已准备就绪。

创建数据集

创建 CSV 文件

我们首先创建一个名为 students.csv 的文件并添加一些数据。

我们在此处使用的数据集是虚构的,包含 9 至 12 年级共 12 条学生记录。每一行代表一个学生,每一列描述不同的属性:

  • name:学生的姓名。
  • grade:学生当前的年级。
  • study_hours:学生学习的小时数。
  • attendance:学生的出勤率百分比。
  • score:学生的考试成绩,按 0-100 分记录。

例如,Ava在9年级,学习了4.5小时,出勤率为95%,考试成绩为82分。这些示例记录让我们可以探讨诸如学习时间是否与考试成绩相关,以及不同年级的平均成绩如何比较等问题。

由于这些数据是虚构的且样本量较小,我们观察到的任何模式仅具有说明性,不应将其视为对一般学生的证据。

但我们的数据将提供足够的信息来进行几种有用的分析。数据如下:

code
name,grade,study_hours,attendance,score
Ava,9,4.5,95,82
Liam,9,6.0,98,91
Sophia,10,3.5,89,76
Noah,10,7.0,99,94
Emma,11,5.5,93,88
Oliver,11,8.0,97,96
Mia,12,4.0,91,79
Ethan,12,6.5,96,90
Isabella,9,7.5,100,97
Lucas,10,2.5,85,68
Amelia,11,6.0,94,92
James,12,5.0,90,84

使用Pandas加载数据集

读取CSV文件

通过导入pandas开始Python程序:

code
import pandas as pd

然后加载CSV文件:

code
data = pd.read_csv("students.csv")

read_csv()函数会读取CSV文件并将其转换为pandas DataFrame。

DataFrame是一种类似表格的数据结构,包含行和列。你可以将其视为可编程的电子表格。

让我们显示数据集:

code
print(data)

你应该在终端中看到学生记录的输出。

数据探索

在分析数据集之前,了解你正在处理的数据很有用。

查看前几行数据

head()方法会显示前五行:

code
print(data.head())

你也可以指定要显示的行数:

code
print(data.head(3))

检查数据集大小

使用shape来获取行数和列数:

code
print(data.shape)

结果将是:

code
(12, 5)

这意味着我们的数据集包含12行和5列。

查看列名

你可以通过以下方式查看列名:

code
print(data.columns)

在程序后续需要引用列时,这会很有用。

检查数据类型

使用info()来查看每列的信息:

code
data.info()

这有助于你识别列中包含的是整数、小数、文本还是其他类型的数据。

计算基础统计信息

Pandas使得在不手动编写数学公式的情况下计算统计信息变得简单。

计算平均分

我们可以使用以下代码计算平均分:

code
average_score = data["score"].mean()

print(f"Average score: {average_score:.2f}")

mean()方法用于计算算术平均值。

:.2f格式说明告诉Python以两位小数显示结果。

查找最高分和最低分

使用max()和min():

code
highest_score = data["score"].max()
lowest_score = data["score"].min()

print(f"Highest score: {highest_score}")
print(f"Lowest score: {lowest_score}")

你也可以查找中位数:

code
median_score = data["score"].median()

print(f"Median score: {median_score}")

中位数是将分数按顺序排列后的中间值。

生成统计摘要

Pandas还提供了便捷的describe()方法:

code
print(data["score"].describe())

这将生成包括以下统计信息的摘要:

  • 数量(Count)
  • 平均值(Mean)
  • 标准差(Standard deviation)
  • 最小值(Minimum)
  • 25%分位数(25th percentile)
  • 中位数(Median)
  • 75%分位数(75th percentile)
  • 最大值(Maximum)

你可以为所有数值列生成摘要:

code
print(data.describe())

这通常是探索不熟悉数据集时使用的第一个命令之一。

筛选数据

pandas 最有用的功能之一是根据条件选择行的能力。

查找高分学生

假设我们想找到得分至少为 90 的学生:

code
high_scores = data[data["score"] >= 90]

print(high_scores)

表达式:

code
data["score"] >= 90

为每一行创建一个布尔条件。pandas 会保留条件为 True 的行。

查找学习时间超过五小时的学生

我们可以使用学习时间执行相同的操作:

code
frequent_studiers = data[data["study_hours"] > 5]

print(frequent_studiers)

你也可以组合多个条件。

例如,假设我们想查找学习时间超过五小时且出勤率高于 95% 的学生:

code
students = data[
    (data["study_hours"] > 5) &
    (data["attendance"] > 95)
]

print(students)

在 pandas 中组合条件时,使用 & 表示 AND,使用 | 表示 OR。每个条件都应放在括号中。

查找特定学生

使用 `idxmax()`

有时候你不仅仅想知道最高值,还想了解包含该值的记录。

例如:

code
top_student_index = data["score"].idxmax()
top_student = data.loc[top_student_index]

print(top_student)

idxmax() 返回包含最大值的行的索引。

我们也可以对学习时间执行相同操作:

code
most_studious_index = data["study_hours"].idxmax()
most_studious_student = data.loc[most_studious_index]

print(most_studious_student)

这使你可以将统计结果与原始记录关联起来。

分组数据

当数据集包含类别时,分组功能变得特别有用。

在我们的数据集中,学生属于不同年级。

按年级计算平均分

我们可以计算每个年级的平均分:

code
average_by_grade = data.groupby("grade")["score"].mean()

print(average_by_grade)

这告诉我们不同年级之间的平均分差异。

我们可以使输出更易于阅读:

code
average_by_grade = (
    data.groupby("grade")["score"]
    .mean()
    .round(2)
)

print(average_by_grade)

多个统计指标

你可以一次计算多个统计指标:

code
grade_summary = data.groupby("grade")["score"].agg(
    ["mean", "min", "max", "count"]
)

print(grade_summary)

这会为每个年级生成包含平均值、最小值、最大值和学生人数的汇总信息。

分析学习时间

我们还可以研究学习时间和分数之间的关系。

计算相关性

pandas 提供了 corr() 方法:

code
correlation = data["study_hours"].corr(data["score"])

print(f"Correlation: {correlation:.2f}")

相关性值通常在 -1 到 1 之间。

接近 1 的值表示更强的正线性关系,接近 -1 的值表示更强的负线性关系。接近 0 的值表示线性关系较弱。

然而,相关性 并不 能证明一个变量导致另一个变量。例如,如果在这个数据集中学习时间和分数相关,这并不能证明学习更多直接导致分数更高。

创建可视化

数字很有用,但可视化可以帮助更容易地识别模式。

创建散点图

我们将创建一个显示学习时间和考试分数的散点图:

code
import matplotlib.pyplot as plt

plt.scatter(data["study_hours"], data["score"])
code

plt.xlabel("Study Hours")
plt.ylabel("Test Score")
plt.title("Study Hours vs. Test Scores")

plt.show()

每个点代表一名学生。

x轴表示学习时间,y轴表示测试分数。

你可能会注意到,随着学习时间的增加,点是否呈现出总体向上移动的趋势。

这应该就是呈现的效果:

Image 2: Matplotlib Scatterplot Output
Image 2: Matplotlib Scatterplot Output

创建条形图

我们还可以可视化每个年级的平均分:

code
average_by_grade = data.groupby("grade")["score"].mean()

average_by_grade.plot(kind="bar")

plt.xlabel("Grade")
plt.ylabel("Average Score")
plt.title("Average Score by Grade")

plt.show()

条形图使不同组之间的平均值比较更加直观。

这就是条形图应该呈现的效果:

Image 3: Matplotlib Bar Chart Output
Image 3: Matplotlib Bar Chart Output

构建完整的分析器

现在让我们将主要思路整合成一个完整的程序。

code
import pandas as pd
import matplotlib.pyplot as plt

# 加载数据集
data = pd.read_csv("students.csv")

# 基本信息
print("Dataset shape:")
print(data.shape)

print("\nFirst five rows:")
print(data.head())

# 分数统计
average_score = data["score"].mean()
median_score = data["score"].median()
highest_score = data["score"].max()
lowest_score = data["score"].min()

print("\nScore Statistics")
print(f"Average: {average_score:.2f}")
print(f"Median: {median_score:.2f}")
print(f"Highest: {highest_score}")
print(f"Lowest: {lowest_score}")

# 90分及以上的学生
high_scores = data[data["score"] >= 90]

print("\nStudents with scores of 90 or higher:")
print(high_scores[["name", "score"]])

# 按年级的平均分
average_by_grade = (
    data.groupby("grade")["score"]
    .mean()
    .round(2)
)

print("\nAverage Score by Grade:")
print(average_by_grade)

# 学习时间和分数的相关性
correlation = data["study_hours"].corr(data["score"])

print(f"\nStudy Hours vs. Score Correlation: {correlation:.2f}")

# 散点图
plt.scatter(data["study_hours"], data["score"])

plt.xlabel("Study Hours")
plt.ylabel("Test Score")
plt.title("Study Hours vs. Test Scores")

plt.show()

现在这个程序能够执行一个完整但小型的数据分析工作流程。

提高分析器的可复用性

下一步有用的改进是将重复的操作转换为函数。

创建分析函数

我们不必将所有内容直接写在主程序中,而是可以创建一个函数:

code
def analyze_scores(data):
    average = data["score"].mean()
    median = data["score"].median()
    highest = data["score"].max()
    lowest = data["score"].min()

    print(f"Average score: {average:.2f}")
    print(f"Median score: {median:.2f}")
    print(f"Highest score: {highest}")
    print(f"Lowest score: {lowest}")

然后通过以下方式调用:

code
analyze_scores(data)

这使得代码更容易与其他DataFrame复用。

创建获取高分学生函数

我们还可以创建一个返回高分学生的函数:

code
def get_top_students(data, minimum_score=90):
    return data[data["score"] >= minimum_score][
        ["name", "grade", "score"]
    ]

现在我们可以随时更改阈值:

code
print(get_top_students(data, 95))

处理缺失数据

现实世界的数据集很少像我们的示例那样干净。你可能会偶尔遇到缺失值。

你可以使用以下方法检查缺失值:

code
print(data.isnull().sum())

这会告诉你每列中存在多少个缺失值。

例如,你可以通过以下方式删除包含缺失值的行:

code
clean_data = data.dropna()

或者,根据数据集和缺失值的含义,你可能需要替换缺失值:

code
data["score"] = data["score"].fillna(data["score"].mean())

你不应该自动用平均值替换每个缺失值。适当的方法取决于缺失数据所代表的内容以及你试图分析的内容。

导出结果

分析数据集后,你可能想要保存结果。

例如:

code
average_by_grade.to_csv("average_scores_by_grade.csv")

你也可以保存筛选后的记录:

code
high_scores.to_csv("high_scoring_students.csv", index=False)

index=False参数可以防止pandas将DataFrame的索引作为额外列添加。

需要避免的常见错误

忘记导入库

确保已导入所需的库:

code
import pandas as pd
import matplotlib.pyplot as plt

否则,Python将不知道pd或plt的含义。

使用错误的列名

列名必须与你的数据集匹配。

例如,如果列名为study_hours,以下写法将无效:

code
data["study time"]

你可以始终通过以下方式检查实际的列名:

code
print(data.columns)

混淆相关性与因果关系

相关性可以识别变量之间的关系,但不能证明一个变量导致了另一个变量。

随着你处理更大更复杂的數據集,这种区别变得越来越重要。

在理解数据之前进行分析

立即计算统计信息可能很诱人。但首先应检查数据集。

有用的初始命令包括:

code
data.head()
data.shape
data.info()
data.describe()
data.isnull().sum()

了解数据的结构和质量有助于避免得出错误的结论。

下一步该怎么做

你构建的分析器是故意保持简单的,但相同的流程可以应用于更大的数据集。

你可以将其扩展为:

  • 分析销售数据
  • 跟踪网站流量
  • 研究调查反馈
  • 分析营销活动
  • 分析体育统计数据
  • 探索金融数据集
  • 跟踪应用程序或客户数据

你还可以添加更高级的功能,如交互式图表、命令行参数、自动生成报告或机器学习模型。

例如,你可以让用户输入CSV文件名,而不是硬编码文件名:

code
filename = input("Enter the CSV filename: ")

data = pd.read_csv(filename)

print(data.head())

现在,相同的程序可以分析不同的CSV文件。

最后的想法

你不需要复杂的算法就可以开始处理数据。借助Python、pandas和相对较小的数据集,你已经可以执行有意义的分析。

在本教程中,你学习了如何:

  • 使用 pandas 加载 CSV 数据
  • 探索 DataFrame
  • 计算统计信息
  • 过滤行
  • 查找特定记录
  • 对数据进行分组
  • 计算相关性
  • 创建可视化图表
  • 处理缺失值
  • 导出分析结果
  • 使用函数组织分析

下一步最重要的事情是使用不同的数据集进行练习。一旦你熟悉了使用 pandas 加载、探索、清理和分析数据,就可以开始构建更复杂的分析项目。

编码愉快!

  • * *
  • * *

免费学习编程。freeCodeCamp 的开源课程已帮助超过 40,000 人成为开发者。立即开始