<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ 数据分析 - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ freeCodeCamp 是一个免费学习编程的开发者社区，涵盖 Python、HTML、CSS、React、Vue、BootStrap、JSON 教程等，还有活跃的技术论坛和丰富的社区活动，在你学习编程和找工作时为你提供建议和帮助。 ]]>
        </description>
        <link>https://www.freecodecamp.org/chinese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ 数据分析 - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 19 May 2026 10:03:11 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/tag/data-analysis/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ 什么是数据分析？如何用 Python、Numpy、Pandas、Matplotlib 和 Seaborn 教程可视化数据 ]]>
                </title>
                <description>
                    <![CDATA[ 原文：What is Data Analysis? How to Visualize Data with Python, Numpy, Pandas, Matplotlib & Seaborn Tutorial [https://www.freecodecamp.org/news/exploratory-data-analysis-with-numpy-pandas-matplotlib-seaborn/] ，作者：Aakash NS [https://www.freecodecamp.org/news/author/aakash-n-s/] 数据分析是一个通过统计测量和可视化，从数据中探索、研究和收集洞见的过程。 数据分析的目标是通过揭示趋势、关系和模式来开发一种对数据的理解。 数据分析既是一门科学，也是一门艺术。一方面，它需要你了解统计、可视化技术和数据分析工具，如 Numpy、Pandas 和 Seaborn。 另一方面，它需要你提出有趣的问题来指导研究，然后解释数字和图表以产生有用的见解。 本数据分析教程涵盖以下主题：  1. 什么是数值计算？Python 和 Nu ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/exploratory-data-analysis-with-numpy-pandas-matplotlib-seaborn/</link>
                <guid isPermaLink="false">6590dcca576bb403fc791414</guid>
                
                    <category>
                        <![CDATA[ 数据分析 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sean Bei ]]>
                </dc:creator>
                <pubDate>Thu, 18 May 2023 06:12:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/12/blog-cover-4.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>原文：<a href="https://www.freecodecamp.org/news/exploratory-data-analysis-with-numpy-pandas-matplotlib-seaborn/">What is Data Analysis? How to Visualize Data with Python, Numpy, Pandas, Matplotlib &amp; Seaborn Tutorial</a>，作者：<a href="https://www.freecodecamp.org/news/author/aakash-n-s/">Aakash NS</a></p><!--kg-card-begin: markdown--><p>数据分析是一个通过统计测量和可视化，从数据中探索、研究和收集洞见的过程。</p>
<p>数据分析的目标是通过揭示趋势、关系和模式来开发一种对数据的理解。</p>
<p>数据分析既是一门科学，也是一门艺术。一方面，它需要你了解统计、可视化技术和数据分析工具，如 Numpy、Pandas 和 Seaborn。</p>
<p>另一方面，它需要你提出有趣的问题来指导研究，然后解释数字和图表以产生有用的见解。</p>
<p>本数据分析教程涵盖以下主题：</p>
<ol>
<li><a href="#what-is-numerical-computation-python-and-numpy-for-beginners">什么是数值计算？Python 和 Numpy 入门</a></li>
<li><a href="#how-to-analyze-tabular-data-using-python-and-pandas">如何使用 Python 和 Pandas 分析表格数据</a></li>
<li><a href="#data-visualization-using-python-matplotlib-and-seaborn">使用 Python、Matplotlib 和 Seaborn 进行数据可视化</a></li>
</ol>
<h2 id="pythonnumpy">什么是数值计算？Python 和 Numpy 入门</h2>
<p><img src="https://i.imgur.com/mg8O3kd.png" alt="mg8O3kd" width="1385" height="480" loading="lazy"></p>
<p>上图来源：<a href="https://github.com/elegant-scipy/elegant-scipy/blob/master/figures/NumPy_ndarrays_v2.png">Elegant Scipy</a>。</p>
<p>你可以跟随教程操作并在此处运行代码：<a href="https://jovian.ai/aakashns/python-numerical-computing-with-numpy">https://jovian.ai/aakashns/python-numerical-computing-with-nump</a>y</p>
<p>本节涵盖以下主题：</p>
<ul>
<li>如何在 Python 中处理数值数据</li>
<li>如何将 Python 列表转换为 Numpy 数组</li>
<li>多维 Numpy 数组及其优点</li>
<li>数组操作、广播、索引和切片</li>
<li>如何使用 Numpy 处理 CSV 数据文件</li>
</ul>
<h3 id="python">如何在 Python 中处理数值数据</h3>
<p><strong>数据分析</strong> 中的“数据”通常是指数值数据，如股票价格、销售数据、传感器测量值、体育得分、数据库表等。</p>
<p><a href="https://jovian.ai/outlink?url=https%3A%2F%2Fnumpy.org">Numpy</a> 库为 Python 中的数值计算提供专门的数据结构、函数和其他工具。让我们通过一个例子来看看为何以及如何使用 Numpy 处理数值数据。</p>
<p>假设我们想使用温度、降雨量和湿度这些气象数据来考察一个区域是否适合种苹果。</p>
<p>一个简单的方法是制定苹果的年产量（每公顷吨）与气候条件之间的线性关系，如平均温度（以华氏度为单位）、降雨量（以毫米为单位）和平均相对湿度（以百分比为单位）。</p>
<p><code>苹果产量 = w1 * 温度 + w2 * 降雨量 + w3 * 湿度</code></p>
<p>我们将苹果的产量表示为温度、降雨量和湿度的加权和。</p>
<p>这个方程是一个近似值，因为实际关系不一定是线性的，可能还涉及其他因素。但像这样的简单线性模型用在练习中效果较好。</p>
<p>基于一些历史数据的统计分析，我们大致可以为权重<code>w1</code>，<code>w2</code> 和 <code>w3</code> 提供合理的值。下面例举了一组值：</p>
<p><code>w1, w2, w3 = 0.3, 0.2, 0.5</code></p>
<p>给定一个地区的一些气候数据，我们就可以预测苹果的产量了。以下是一些示例数据：</p>
<p><img src="https://i.imgur.com/TXPBiqv.png" alt="TXPBiqv" width="846" height="330" loading="lazy"></p>
<p>首先，我们定义一些变量来记录一个地区的气候数据。</p>
<pre><code class="language-python">kanto_temp = 73
kanto_rainfall = 67
kanto_humidity = 43
</code></pre>
<p>然后，我们就可以将这些变量代入线性方程来预测苹果的产量了。</p>
<pre><code class="language-python">kanto_yield_apples = kanto_temp * w1 + kanto_rainfall * w2 + kanto_humidity * w3
kanto_yield_apples
# 56.8

print("The expected yield of apples in Kanto region is {} tons per hectare.".format(kanto_yield_apples))
# Kanto 地区苹果的预期产量为每公顷 56.8 吨。
</code></pre>
<p>为了能更容易地对多个区域执行上述的计算，我们可以将每个区域的气候数据表示为向量，即数字列表。</p>
<pre><code class="language-python">kanto = [73, 67, 43]
johto = [91, 88, 64]
hoenn = [87, 134, 58]
sinnoh = [102, 43, 37]
unova = [69, 96, 70]
</code></pre>
<p>每个向量中的三个数字分别代表温度、降雨量和湿度数据。</p>
<p>我们还可以将公式中使用的权重集表示为一个向量。</p>
<p><code>weights = [w1, w2, w3]</code></p>
<p>现在我们就可以编写一个函数 <code>crop_yield</code>，通过给定的气候数据和相应权重，来计算苹果（或任何其他作物）的产量了。</p>
<pre><code class="language-python">def crop_yield(region, weights):
    result = 0
    for x, w in zip(region, weights):
        result += x * w
    return result
    
crop_yield(kanto, weights)
# 56.8

crop_yield(johto, weights)
# 76.9

crop_yield(unova, weights)
# 74.9
</code></pre>
<h3 id="pythonnumpy">如何将 Python 列表转换为 Numpy 数组</h3>
<p><code>crop_yield</code> 执行的计算（两个向量的元素相乘并对结果求和）也称为 <strong>点积</strong>。从 <a href="https://www.khanacademy.org/math/linear-algebra/vectors-and-spaces/dot-cross-products/v/vector-dot-product-and-vector-length">这里</a> 了解更多点积的信息。</p>
<p>Numpy 库提供了一个内置函数来计算两个向量的点积。但是，我们必须先将列表转换为 Numpy 数组才行。</p>
<p>我们使用 <code>pip</code> 包管理器安装 Numpy 库。</p>
<p><code>!pip install numpy --upgrade --quiet</code></p>
<p>接下来，让我们导入 <code>numpy</code> 模块。导入 <code>numpy</code> 时通常使用别名 <code>np</code>。</p>
<p><code>import numpy as np</code></p>
<p>现在，我们可以使用 <code>np.array</code> 函数创建 Numpy 数组。</p>
<pre><code class="language-python">kanto = np.array([73, 67, 43])

kanto
# array([73, 67, 43])

weights = np.array([w1, w2, w3])

weights
# array([0.3, 0.2, 0.5])
</code></pre>
<p>Numpy 数组的类型为 <code>ndarray</code>。</p>
<pre><code class="language-python">type(kanto)
# numpy.ndarray

type(weights)
# numpy.ndarray
</code></pre>
<p>与列表一样，Numpy 数组也支持索引符号 <code>[]</code>。</p>
<pre><code class="language-python">weights[0]
# 0.3

kanto[2]
#43
</code></pre>
<h3 id="numpy">如何操作 Numpy 数组</h3>
<p>我们可以使用 <code>np.dot</code> 函数来计算两个向量的点积。</p>
<pre><code class="language-python">np.dot(kanto, weights)
# 56.8
</code></pre>
<p>我们可以通过 Numpy 数组支持的底层操作实现相同的结果：执行元素相乘并计算所得数字之和。</p>
<pre><code class="language-python">(kanto * weights).sum()
# 56.8
</code></pre>
<p>如果两个数组的大小相同，<code>*</code> 操作符将执行元素相乘。<code>sum</code> 方法计算数组中数字的总和。</p>
<pre><code class="language-python">arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

arr1 * arr2
# array([ 4, 10, 18])

arr2.sum()
# 15
</code></pre>
<h3 id="numpy">使用 Numpy 数组有什么好处？</h3>
<p>与 Python 的列表相比，Numpy 数组在操作数值数据方面具有以下优势：</p>
<ul>
<li>**它们很容易 <strong>使用</strong>：你可以编写像 <code>(kanto * weights).sum()</code> 这样的小型、简洁和直观的数学表达式，而不是使用循环和自定义函数（如 <code>crop_yield</code>）。</li>
<li><strong>性能</strong>：Numpy 的操作和函数由 C++ 内部实现，这使得它们比使用 Python 的语句和循环快得多，因为后者是在运行时解释的。</li>
</ul>
<p>以下是对 Python 循环和 Numpy 数组执行的点积的比较，使用两个向量，每个都有一百万个元素。</p>
<pre><code># Python lists
arr1 = list(range(1000000))
arr2 = list(range(1000000, 2000000))

# Numpy arrays
arr1_np = np.array(arr1)
arr2_np = np.array(arr2)

%%time
result = 0
for x1, x2 in zip(arr1, arr2):
    result += x1*x2
result

# CPU times: user 300 ms, sys: 3.26 ms, total: 303 ms
# Wall time: 302 ms
# 833332333333500000

%%time
np.dot(arr1_np, arr2_np)

# CPU times: user 2.11 ms, sys: 951 µs, total: 3.07 ms
# Wall time: 1.58 ms
# 833332333333500000
</code></pre>
<p>如你所见，使用 <code>np.dot</code> 比使用 <code>for</code> 循环快 100 倍。这使得 Numpy 处理非常大的数据集时非常有用，特别是那些具有数万或数百万个数据点时。</p>
<h3 id="numpy">多维 Numpy 数组</h3>
<p>现在让我们更进一步，使用单个二维 Numpy 数组来表示所有地区的气候数据。</p>
<pre><code>climate_data = np.array([[73, 67, 43],
                         [91, 88, 64],
                         [87, 134, 58],
                         [102, 43, 37],
                         [69, 96, 70]])
                         
climate_data
# array([[ 73,  67,  43],
#        [ 91,  88,  64],
#        [ 87, 134,  58],
#        [102,  43,  37],
#        [ 69,  96,  70]])
</code></pre>
<p>如果你在高中时学过线性代数课，你会把上面的二维数组看作是一个五行三列的矩阵。每一行代表一个区域，列分别代表温度、降雨量和湿度。</p>
<p>Numpy 数组可以有任意数量的维度，每个维度可以有不同的长度。可以通过数组的 <code>.shape</code> 属性来检查每个维度的长度。</p>
<p><img src="https://fgnt.github.io/python_crashkurs_doc/_images/numpy_array_t.png" alt="numpy_array_t" width="1440" height="805" loading="lazy"></p>
<p>上图来源：<a href="https://github.com/elegant-scipy/elegant-scipy/blob/master/figures/NumPy_ndarrays_v2.png">Elegant Scipy</a>。</p>
<pre><code># 2D array (matrix)
climate_data.shape
# (5, 3)

weights
# array([0.3, 0.2, 0.5])

# 1D array (vector)
weights.shape
# (3,)

# 3D array 
arr3 = np.array([
    [[11, 12, 13], 
     [13, 14, 15]], 
    [[15, 16, 17], 
     [17, 18, 19.5]]])

arr3.shape
# (2, 2, 3)
</code></pre>
<p>Numpy 数组中的所有元素都具有相同的数据类型。你可以使用 <code>.dtype</code> 属性检查数组的数据类型。</p>
<pre><code>weights.dtype
# dtype('float64')

climate_data.dtype
# dtype('int64')
</code></pre>
<p>如果数组中包含一个浮点数，所有其他元素也会转换为浮点数。</p>
<pre><code>arr3.dtype
# dtype('float64')
</code></pre>
<p>通过 <code>climate_data</code> （一个 5x3 的矩阵）和 <code>weights</code> （一个长度为 3 的向量）之间的单一矩阵乘法，我们就可以计算出所预测的苹果产量了。看起来就像下面这样：</p>
<p><img src="https://i.imgur.com/LJ2WKSI.png" alt="LJ2WKSI" width="578" height="334" loading="lazy"></p>
<p>通过观看<a href="https://www.youtube.com/watch?v=xyAuNHPsq-g&amp;list=PLFD0EB975BA0CC1E0&amp;index=1">这个 YouTube 播放列表</a>的前 3-4 个视频，你可以学到矩阵及矩阵乘法。</p>
<p>我们可以使用 <code>np.matmul</code> 函数或者 <code>@</code> 操作符来执行矩阵乘法。</p>
<pre><code>np.matmul(climate_data, weights)
# array([56.8, 76.9, 81.9, 57.7, 74.9])

climate_data @ weights
# array([56.8, 76.9, 81.9, 57.7, 74.9])
</code></pre>
<h3 id="csv">如何处理 CSV 数据文件</h3>
<p>Numpy 同样提供辅助函数来对文件进行读写。我们来下载一个文件 <code>climate.txt</code>，它包含了 10,000 个气候测量结果（温度、降雨量和湿度），格式如下：</p>
<pre><code>temperature,rainfall,humidity
25.00,76.00,99.00
39.00,65.00,70.00
59.00,45.00,77.00
84.00,63.00,38.00
66.00,50.00,52.00
41.00,94.00,77.00
91.00,57.00,96.00
49.00,96.00,99.00
67.00,20.00,28.00
...
</code></pre>
<p>这种存储数据的格式称为 <strong>comma-separated values</strong> 或者 CSV。</p>
<blockquote>
<p><strong><strong>CSVs</strong></strong>：逗号分隔值（CSV）文件是使用逗号分隔值的分隔文本文件。文件的每一行就是一条数据记录。每条记录包括一个或多个字段，以逗号隔开。CSV 文件通常以纯文本形式存储表格数据（数字和文本），因此每行都有相同数量的字段。（维基百科）</p>
</blockquote>
<p>我们使用 <code>genfromtxt</code> 函数来把这个文件读入一个到 numpy 数组中。</p>
<pre><code>import urllib.request

urllib.request.urlretrieve(
    'https://hub.jovian.ml/wp-content/uploads/2020/08/climate.csv', 
    'climate.txt')
    
climate_data = np.genfromtxt('climate.txt', delimiter=',', skip_header=1)

climate_data
# array([[25., 76., 99.],
#        [39., 65., 70.],
#        [59., 45., 77.],
#        ...,
#        [99., 62., 58.],
#        [70., 71., 91.],
#        [92., 39., 76.]])

climate_data.shape
# (10000, 3)
</code></pre>
<p>现在，我们可以使用 <code>@</code> 运算符执行矩阵乘法，利用给定的权重集预测整个数据集的苹果产量。</p>
<pre><code>weights = np.array([0.3, 0.2, 0.5])

yields = climate_data @ weights
yields
# array([72.2, 59.7, 65.2, ..., 71.1, 80.7, 73.4])

yields.shape
# (10000,)
</code></pre>
<p>让我们使用 <a href="https://numpy.org/doc/stable/reference/generated/numpy.concatenate.html"><code>np.concatenate</code></a> 函数将产量添加到 <code>climate_data</code> 中，作为第四列。</p>
<pre><code>climate_results = np.concatenate((climate_data, yields.reshape(10000, 1)), axis=1)

climate_results
# array([[25. , 76. , 99. , 72.2],
#        [39. , 65. , 70. , 59.7],
#        [59. , 45. , 77. , 65.2],
#        ...,
#        [99. , 62. , 58. , 71.1],
#        [70. , 71. , 91. , 80.7],
#        [92. , 39. , 76. , 73.4]])
</code></pre>
<p>这里有几个微妙之处：</p>
<ul>
<li>由于我们希望添加新列，我们把参数 <code>axis=1</code> 传给 <code>np.concatenate</code>。<code>axis</code> 参数指定了串联的维度。</li>
<li>数组必须有相同数量的维度，每个维度长度要相同，除了用于串联的维度。我们使用 <a href="https://jovian.ai/outlink?url=https%3A%2F%2Fnumpy.org%2Fdoc%2Fstable%2Freference%2Fgenerated%2Fnumpy.reshape.html"><code>np.reshape</code></a> 函数来将 <code>yields</code> 的形状从 <code>(10000,)</code> 改到 <code>(10000,1)</code>。</li>
</ul>
<p>以下是在 <code>axis=1</code> 时 <code>np.concatenate</code> 的一个直观解释（你能猜出 <code>axis=0</code> 的结果是什么吗？）：</p>
<p><img src="https://www.w3resource.com/w3r_images/python-numpy-image-exercise-58.png" alt="python-numpy-image-exercise-58" width="576" height="536" loading="lazy"></p>
<p>上图来源：<a href="https://chinese.freecodecamp.org/news/exploratory-data-analysis-with-numpy-pandas-matplotlib-seaborn/w3resource.com">w3resource.com</a>。</p>
<p>理解 Numpy 函数的最好方式是是对其进行试验并阅读文档以了解其参数和返回值。使用下面的单元格来试验 <code>np.concatenate</code> 和 <code>np.reshape</code>。</p>
<p>让我们使用 <code>np.savetxt</code> 函数来将上面计算的最终结果写回到文件中。</p>
<pre><code>np.savetxt('climate_results.txt', 
           climate_results, 
           fmt='%.2f', 
           delimiter=',',
           header='temperature,rainfall,humidity,yeild_apples', 
           comments='')
</code></pre>
<p>结果以 CSV 格式写回文件 <code>climate_results.txt</code>。</p>
<pre><code>temperature,rainfall,humidity,yeild_apples
25.00,76.00,99.00,72.20
39.00,65.00,70.00,59.70
59.00,45.00,77.00,65.20
84.00,63.00,38.00,56.80
...
</code></pre>
<p>Numpy 提供了数百个用于对数组执行操作的函数。以下是一些常用的函数：</p>
<ul>
<li>数学：<code>np.sum</code>、<code>np.exp</code>、<code>np.round</code>，以及算术运算符</li>
<li>数组操作：<code>np.reshape</code>、<code>np.stack</code>、<code>np.concatenate</code>、<code>np.split</code></li>
<li>线性代数：<code>np.matmul</code>、<code>np.dot</code>、<code>np.transpose</code>、<code>np.eigvals</code></li>
<li>统计：<code>np.mean</code>、<code>np.median</code>、<code>np.std</code>、<code>np.max</code></li>
</ul>
<p><strong>那么如何找到你需要的函数呢？</strong> 要找到特定操作或用例的正确函数，最简单的方法就是网络搜索。例如，搜索“如何连接 numpy 数组”，就会找到<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fcmdlinetips.com%2F2018%2F04%2Fhow-to-concatenate-arrays-in-numpy%2F">数组连接教程</a>。</p>
<p>你可以在这里找到<a href="https://numpy.org/doc/stable/reference/routines.html">数组函数的完整列表</a>.</p>
<h3 id="numpy">Numpy 算术运算、广播和比较</h3>
<p>Numpy 数组支持像 <code>+</code>，<code>-</code>，<code>*</code> 等的算术运算。你可以对一个单一的数字（也称为标量）或者具有同样形状的数组进行算术运算。</p>
<p>运算符让编写具有多维数组的数学表达式变得很容易。</p>
<pre><code>arr2 = np.array([[1, 2, 3, 4], 
                 [5, 6, 7, 8], 
                 [9, 1, 2, 3]])
                 
arr3 = np.array([[11, 12, 13, 14], 
                 [15, 16, 17, 18], 
                 [19, 11, 12, 13]])
                 
# Adding a scalar
arr2 + 3

# array([[ 4,  5,  6,  7],
#        [ 8,  9, 10, 11],
#        [12,  4,  5,  6]])

# Element-wise subtraction
arr3 - arr2

# array([[10, 10, 10, 10],
#        [10, 10, 10, 10],
#        [10, 10, 10, 10]])

# Division by scalar
arr2 / 2

# array([[0.5, 1. , 1.5, 2. ],
#        [2.5, 3. , 3.5, 4. ],
#        [4.5, 0.5, 1. , 1.5]])

# Element-wise multiplication
arr2 * arr3

# array([[ 11,  24,  39,  56],
#        [ 75,  96, 119, 144],
#        [171,  11,  24,  39]])

# Modulus with scalar
arr2 % 4

# array([[1, 2, 3, 0],
#        [1, 2, 3, 0],
#        [1, 1, 2, 3]])
</code></pre>
<h4 id="numpy"><strong>Numpy 数组广播</strong></h4>
<p>Numpy 数组也支持 <strong>广播</strong>，允许在具有不同维数但形状兼容的两个数组之间进行算术运算。让我们通过一个例子来看看它是如何工作的。</p>
<pre><code>arr2 = np.array([[1, 2, 3, 4], 
                 [5, 6, 7, 8], 
                 [9, 1, 2, 3]])               
arr2.shape
# (3, 4)

arr4 = np.array([4, 5, 6, 7])
arr4.shape
# (4,)

arr2 + arr4
# array([[ 5,  7,  9, 11],
#        [ 9, 11, 13, 15],
#        [13,  6,  8, 10]])
</code></pre>
<p>当计算表达式 <code>arr2 + arr4</code> 时，<code>arr4</code> (形状为 <code>(4,)</code>）被复制了三次以匹配 <code>arr2</code> 的形状 <code>(3, 4)</code>。Numpy 执行复制时，并不真实地去创建较小维度数组的三个副本，这样就提高了性能，并使用更少的内存。</p>
<p><img src="https://jakevdp.github.io/PythonDataScienceHandbook/figures/02.05-broadcasting.png" alt="02.05-broadcasting" width="432" height="324" loading="lazy"></p>
<p>上图来源：<a href="https://jakevdp.github.io/PythonDataScienceHandbook/02.05-computation-on-arrays-broadcasting.html">Python 数学科学手册</a>。</p>
<p>只有当一个数组可以复制以匹配另一个数组的形状时，广播才有效。</p>
<pre><code>arr5 = np.array([7, 8])
arr5.shape
# (2,)

arr2 + arr5
# ValueError: operands could not be broadcast together with shapes (3,4) (2,) 
</code></pre>
<p>在上面的例子中，即使 <code>arr5</code> 被复制三次，它并不能匹配 <code>arr2</code> 的形状。所以无法成功计算 <code>arr2 + arr5</code>。<a href="https://numpy.org/doc/stable/user/basics.broadcasting.html">在此处学习有关广播的更多信息</a>.</p>
<h4 id="numpy"><strong>Numpy 数组比较</strong></h4>
<p>Numpy 数组也支持像 <code>==</code>、<code>!=</code>、<code>&gt;</code> 等这样的比较操作符。比较结果是一个布尔值数组。</p>
<pre><code>arr1 = np.array([[1, 2, 3], [3, 4, 5]])
arr2 = np.array([[2, 2, 3], [1, 2, 5]])

arr1 == arr2
# array([[False,  True,  True],
#        [False, False,  True]])

arr1 != arr2
# array([[ True, False, False],
#        [ True,  True, False]])

arr1 &gt;= arr2
# array([[False,  True,  True],
#        [ True,  True,  True]])

arr1 &lt; arr2
# array([[ True, False, False],
#        [False, False, False]])
</code></pre>
<p>数组比较经常使用 <code>sum</code> 方法来计算两个数组中相等元素的数量。请记住，在算术运算中使用布尔值时，<code>True</code> 被视为 <code>1</code>，而<code>False</code> 被视为 <code>0</code>。</p>
<pre><code>(arr1 == arr2).sum()
# 3
</code></pre>
<h3 id="numpy">Numpy 数组索引和切片</h3>
<p>Numpy 以一种直观的方式，将 Python 的列表索引符号 <code>[]</code> 扩展到多个维度。你可以提供一个以逗号分隔的索引或范围列表，来从 Numpy 数组中选择一个指定的元素或者一个子数组（也称为切片）。</p>
<pre><code class="language-python">arr3 = np.array([
    [[11, 12, 13, 14], 
     [13, 14, 15, 19]], 
    
    [[15, 16, 17, 21], 
     [63, 92, 36, 18]], 
    
    [[98, 32, 81, 23],      
     [17, 18, 19.5, 43]]])
     
arr3.shape
# (3, 2, 4)

# Single element
arr3[1, 1, 2]

# 36.0

# Subarray using ranges
arr3[1:, 0:1, :2]

# array([[[15., 16.]],
# 
#        [[98., 32.]]])

# Mixing indices and ranges
arr3[1:, 1, 3]

# array([18., 43.])

arr3[1:, 1, :3]
# array([[63. , 92. , 36. ],
#        [17. , 18. , 19.5]])

# Using fewer indices
arr3[1]

# array([[15., 16., 17., 21.],
#        [63., 92., 36., 18.]])

arr3[:2, 1]
# array([[13., 14., 15., 19.],
#        [63., 92., 36., 18.]])

# Using too many indices
arr3[1,3,2,1]

# IndexError: too many indices for array: array is 3-dimensional, but 4 were indexed
</code></pre>
<p>符号及其结果起初看起来会有点困惑，因此请花点时间进行实验并适应它。</p>
<p>请用下面的单元格，使用不同的索引和范围组合，尝试进行数组索引和切片的一些示例。以下是一些直观演示的示例：</p>
<p><img src="https://scipy-lectures.org/_images/numpy_indexing.png" alt="numpy_indexing" width="772" height="383" loading="lazy"></p>
<p>上图来源：<a href="https://scipy-lectures.org/intro/numpy/array_object.html">Scipy 讲座</a>。</p>
<h3 id="numpy">如何用其他方法创建 Numpy 数组</h3>
<p>Numpy 还提供了一些简便的函数来创建具有固定或随机形状的数组。查阅<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fnumpy.org%2Fdoc%2Fstable%2Freference%2Froutines.array-creation.html">官方文档</a>或者使用 <code>help</code> 函数来了解更多。</p>
<pre><code># All zeros
np.zeros((3, 2))

# array([[0., 0.],
#        [0., 0.],
#        [0., 0.]])

# All ones
np.ones([2, 2, 3])

# array([[[1., 1., 1.],
#         [1., 1., 1.]],
#
#        [[1., 1., 1.],
#         [1., 1., 1.]]])

# Identity matrix
np.eye(3)

# array([[1., 0., 0.],
#        [0., 1., 0.],
#        [0., 0., 1.]])

# Random vector
np.random.rand(5)

# array([0.92929562, 0.11301864, 0.64213555, 0.8600434 , 0.53738656])

# Random matrix
np.random.randn(2, 3) # rand vs. randn - what's the difference?

# array([[ 0.09906435, -1.64668094,  0.08073528],
#        [ 0.1437016 ,  0.80715712,  1.27285476]])

# Fixed value
np.full([2, 3], 42)

# array([[42, 42, 42],
#        [42, 42, 42]])

# Range with start, end and step
np.arange(10, 90, 3)

# array([10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58,
#        61, 64, 67, 70, 73, 76, 79, 82, 85, 88])

# Equally spaced numbers in a range
np.linspace(3, 27, 9)

# array([ 3.,  6.,  9., 12., 15., 18., 21., 24., 27.])
</code></pre>
<h3 id="">练习</h3>
<p>尝试以下练习来熟悉 Numpy 数组，锻炼你的技能：</p>
<ul>
<li>Numpy 数组函数的赋值：<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fjovian.ml%2Faakashns%2Fnumpy-array-operations">https://jovian.ml/aakashns/numpy-array-operations</a></li>
<li>（选做）100个 Numpy 小练习：<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fjovian.ml%2Faakashns%2F100-numpy-exercises">https://jovian.ml/aakashns/100-numpy-exercises</a></li>
</ul>
<h3 id="">总结和进一步阅读</h3>
<p>到此，我们完成了用 Numpy 进行数值计算的讨论。本教程的这一部分，我们介绍了以下主题：</p>
<ul>
<li>如何从 Python 列表转到 Numpy 数组</li>
<li>如何操作 Numpy 数组</li>
<li>相对列表而言，使用 Numpy 数组的优势</li>
<li>多维 Numpy 数组</li>
<li>如何处理 CSV 数据文件</li>
<li>算术运算与广播</li>
<li>数组索引和切片</li>
<li>创建 Numpy 的其他方法</li>
</ul>
<p>查阅以下资源以学习更多 Numpy 知识：</p>
<ul>
<li><a href="https://numpy.org/devdocs/user/quickstart.html">官方文档</a></li>
<li><a href="https://chinese.freecodecamp.org/news/the-ultimate-guide-to-the-numpy-scientific-computing-library-for-python/">freeCodeCamp 上的 Numpy 教程</a></li>
<li><a href="http://scipy-lectures.org/advanced/advanced_numpy/index.html">高级 Numpy（探索内部结构）</a></li>
</ul>
<h3 id="">回顾问题以检验你的掌握程度</h3>
<p>尝试回答以下问题来测试你对本文前面话题的掌握程度：</p>
<ol>
<li>什么是向量？</li>
<li>如何用 Python 列表来表示向量？请举例。</li>
<li>什么是两个向量的点积？</li>
<li>写一个函数来计算两个向量的点积。</li>
<li>什么是 Numpy？</li>
<li>如何安装 Numpy？</li>
<li>如何导入 <code>numpy</code> 模块？</li>
<li>用别名导入一个模块意味着什么？请举例。</li>
<li>通常使用的 <code>numpy</code> 别名是什么？</li>
<li>什么是 Numpy 数组？</li>
<li>如何创建 Numpy 数组？请举例。</li>
<li>什么是 Numpy 数组的类型？</li>
<li>如何访问 Numpy 数组的元素？</li>
<li>如何使用 Numpy 计算两个向量的点积？</li>
<li>如果尝试计算具有不同大小的两个向量的点积，会怎么样？</li>
<li>如何计算两个 Numpy 数组的元素乘积？</li>
<li>如何计算 Numpy 数组中所有元素的总和？</li>
<li>相对 Python 列表，使用 Numpy 数组处理数值数据的优势是什么？</li>
<li>为什么 Numpy 数组操作比 Python 函数和循环具有更好的性能？</li>
<li>举例说明 Numpy 数组操作和 Python 循环之间的性能差异。</li>
<li>什么是多维 Numpy 数组？</li>
<li>举例说明如何创建 2、3 和 4 维的 Numpy 数组。</li>
<li>如何查看 Numpy 数组的维度数量以及每个维度的长度？</li>
<li>Numpy 数组中的元素可以有不同的数据类型吗？</li>
<li>如何查看 Numpy 数组中元素的数据类型？</li>
<li>Numpy 数组的数据类型是什么？</li>
<li>矩阵和二维 Numpy 数组的区别是什么？</li>
<li>如何用 Numpy 执行矩阵乘法？</li>
<li>Numpy 中的 <code>@</code> 操作符用于做什么？</li>
<li>什么是 CSV 文件格式？</li>
<li>如何使用 Numpy 从 CSV 文件中读取数据？</li>
<li>如何连接两个 Numpy 数组？</li>
<li><code>np.concatenate</code> 的 <code>axis</code> 参数的作用是什么？</li>
<li>什么时候两个 Numpy 数组可以兼容连接？</li>
<li>给出一个能进行连接的两个 Numpy 数组的例子。</li>
<li>给出一个不能进行连接的两个 Numpy 数组的例子。</li>
<li><code>np.reshape</code> 函数的作用是什么？</li>
<li>“reshape”一个 Numpy 数组是什么意思？</li>
<li>如何将 numpy 数组写入 CSV 文件？</li>
<li>给出一些用于执行数学运算的 Numpy 函数示例。</li>
<li>给出一些用于执行数组操作的 Numpy 函数示例。</li>
<li>给出一些用于执行线性代数的 Numpy 函数示例。</li>
<li>给出一些用于执行统计运算的 Numpy 函数示例。</li>
<li>如何为特定操作或用例找到正确的 Numpy 函数？</li>
<li>在哪里可以看到所有 Numpy 数组函数和操作的列表？</li>
<li>Numpy 数组支持哪些算术运算符？举例说明。</li>
<li>什么是数组广播？它如何有用？举例说明。</li>
<li>给出一些兼容广播的数组的例子。</li>
<li>给出一些不兼容广播的数组的例子。</li>
<li>Numpy 数组支持哪些比较运算符？举例说明。</li>
<li>如何从 Numpy 数组访问特定的子数组或切片？</li>
<li>通过一些示例说明多维 Numpy 数组中的数组索引和切片。</li>
<li>如何创建一个全为0的给定形状的 Numpy 数组？</li>
<li>如何创建一个全为1的给定形状的 Numpy 数组？</li>
<li>如何创建给定形状的单位矩阵？</li>
<li>如何创建一个给定长度的随机向量？</li>
<li>如何创建给定形状且每个元素具有固定值的Numpy数组？</li>
<li>如何创建给定形状且每个元素具有随机初始值的Numpy数组？</li>
<li><code>np.random.rand</code> 与 <code>np.random.randn</code> 的区别是什么？举例说明。</li>
<li><code>np.arange</code> 与 <code>np.linspace</code> 的区别是什么？举例说明。</li>
</ol>
<p>现在，你已经准备好进入本教程的下一节了。</p>
<h2 id="pythonpandas">如何用 Python 和 Pandas 分析表格数据</h2>
<p><img src="https://i.imgur.com/zfxLzEv.png" alt="zfxLzEv" width="3175" height="1414" loading="lazy"></p>
<p>按照下面的步骤运行代码：<a href="https://jovian.ai/aakashns/python-pandas-data-analysis">https://jovian.ai/aakashns/python-pandas-data-analysis</a>。</p>
<p>本节包含以下主题：</p>
<ul>
<li>如何将 CSV 文件读入到 Pandas 数据帧</li>
<li>如何从 Pandas 数据帧中获得数据</li>
<li>如何查询、排序和分析数据</li>
<li>如何合并、分组和汇总数据</li>
<li>如何从日期中提取有用信息</li>
<li>使用直线图和条形图进行基本绘图</li>
<li>如何将数据帧写到 CSV 文件中</li>
</ul>
<h3 id="pandascsv">如何用 Pandas 读取 CSV 文件</h3>
<p><a href="https://jovian.ai/outlink?url=https%3A%2F%2Fpandas.pydata.org%2F">Pandas</a> 是一个非常流行的 Python 库，用于处理表格数据（类似于存在电子表格中的数据）。 它提供了辅助函数，用以从各种文件格式（如CSV、Excel电子表格、HTML表格、JSON、SQL等）中读取数据。</p>
<p>我们下载一个文件 <code>italy-covid-daywise.txt</code>，里面包含了意大利每日的 Covid-19 数据，格式如下：</p>
<pre><code>date,new_cases,new_deaths,new_tests
2020-04-21,2256.0,454.0,28095.0
2020-04-22,2729.0,534.0,44248.0
2020-04-23,3370.0,437.0,37083.0
2020-04-24,2646.0,464.0,95273.0
2020-04-25,3021.0,420.0,38676.0
2020-04-26,2357.0,415.0,24113.0
2020-04-27,2324.0,260.0,26678.0
2020-04-28,1739.0,333.0,37554.0
...
</code></pre>
<p>这种存储数据的格式被称为 <strong>comma-separated values</strong> 或者 CSV。如果你需要 CSV 格式的定义，可以参考以下：</p>
<blockquote>
<p><strong>CSVs</strong>：逗号分隔值（CSV）文件是一种用逗号分隔数值的分隔文本文件。文件中的每一行都是一条数据记录。每一条记录包含一个或多个字段，以逗号隔开。CSV 文件通常以纯文本形式存储表格数据（数字和文本），每一行拥有相同数量的字段。（维基百科）</p>
</blockquote>
<p>我们使用 <code>urlretrieve</code> 函数从 <code>urllib.request</code> 模块中下载这个文件。</p>
<pre><code>from urllib.request import urlretrieve

urlretrieve('https://hub.jovian.ml/wp-content/uploads/2020/09/italy-covid-daywise.csv', 'italy-covid-daywise.csv')
</code></pre>
<p>要读取文件，我们可以使用 Pandas 的 <code>read_csv</code> 方法。首先，让我们安装 Pandas 库。</p>
<pre><code>!pip install pandas --upgrade --quiet
</code></pre>
<p>现在我们可以导入 <code>pandas</code> 模块。按照惯例，导入时会使用别名 <code>pd</code>。</p>
<pre><code>import pandas as pd

covid_df = pd.read_csv('italy-covid-daywise.csv')
</code></pre>
<p>文件中的数据被读取并存到 <code>DataFrame</code> 对象——它是 Pandas 中的一个核心数据结构，用于存储和处理表格数据。通常我们在数据帧的变量名称中使用 <code>_df</code> 后缀。</p>
<pre><code>type(covid_df)
# pandas.core.frame.DataFrame

covid_df
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-110.png" class="kg-image" alt="image-110" width="600" height="400" loading="lazy"></figure>
<p>以下是我们通过查看数据帧可以得知的信息：</p>
<ul>
<li>该文件提供了意大利新冠肺炎的四项每日计数</li>
<li>报告的指标是确诊病例、死亡人数和测试人数</li>
<li>提供了248天的数据：从2019年12月12日到2020年9月3日</li>
</ul>
<p>请记住，这些是官方报告的数字。实际病例和死亡人数可能更高，因为并非所有病例都被诊断出来。</p>
<p>我们可以通过 <code>.info</code> 方法来查看数据帧的一些基本信息。</p>
<pre><code>covid_df.info()
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-109.png" class="kg-image" alt="image-109" width="600" height="400" loading="lazy"></figure>
<p>看起来每一列都包含了一种特定数据类型的值。你可以通过 <code>.describe</code> 方法来查看数值列的统计信息（平均值、标准偏差、最小值/最大值和非空值的数量）。</p>
<pre><code>covid_df.describe()
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-110.png" class="kg-image" alt="image-110" width="600" height="400" loading="lazy"></figure>
<p><code>columns</code> 属性包含数据帧中的列列表。</p>
<pre><code>covid_df.columns
# Index(['date', 'new_cases', 'new_deaths', 'new_tests'], dtype='object')
</code></pre>
<p>你还可以使用 <code>.shape</code> 方法获取数据帧的行数和列数。</p>
<pre><code>covid_df.shape
# (248, 4)
</code></pre>
<p>下面是我们到目前为止所研究的函数和方法的总结：</p>
<ul>
<li><code>pd.read_csv</code> – 将数据从 CSV 文件中读入到 Pandas 的 <code>DataFrame</code> 对象中</li>
<li><code>.info()</code> – 查看关于行、列和数据类型的基本信息</li>
<li><code>.describe()</code> – 查看数值列的统计信息</li>
<li><code>.columns</code> – 获取一个包含列名的列表</li>
<li><code>.shape</code> – 获取行数和列数作为一个数组</li>
</ul>
<h3 id="pandas">如何从 Pandas 数据帧中检索数据</h3>
<p>你想做的首件事可能是从这个数据帧中检索数据，如一个指定日的计数，或者一个特定列的值列表。</p>
<p>为此，你应该了解数据帧中数据的内部表示方法。从概念上讲，你可以将数据帧视为一个字典列表：键是列名，值是包含相应列数据的列表或数组。</p>
<pre><code class="language-python"># Pandas format is simliar to this
covid_data_dict = {
    'date':       ['2020-08-30', '2020-08-31', '2020-09-01', '2020-09-02', '2020-09-03'],
    'new_cases':  [1444, 1365, 996, 975, 1326],
    'new_deaths': [1, 4, 6, 8, 6],
    'new_tests': [53541, 42583, 54395, None, None]
}
</code></pre>
<p>用上面的格式来表示数据具有以下几个好处：</p>
<ul>
<li>列中的所有值通常具有相同类型的值，因此将它们存储在单个数组中更有效。</li>
<li>检索特定行的值只需要从每个列数组中提取给定索引处的元素。</li>
<li>与其他格式相比，如对每行数据使用字典，这种表示形式更加紧凑（列名只记录一次）（参见下面的示例）。</li>
</ul>
<pre><code class="language-python"># Pandas 格式与此不相似
covid_data_list = [
    {'date': '2020-08-30', 'new_cases': 1444, 'new_deaths': 1, 'new_tests': 53541},
    {'date': '2020-08-31', 'new_cases': 1365, 'new_deaths': 4, 'new_tests': 42583},
    {'date': '2020-09-01', 'new_cases': 996, 'new_deaths': 6, 'new_tests': 54395},
    {'date': '2020-09-02', 'new_cases': 975, 'new_deaths': 8 },
    {'date': '2020-09-03', 'new_cases': 1326, 'new_deaths': 6},
]
</code></pre>
<p>与字典列表进行类比，你大概可以猜到如何从数据帧中检索数据。例如，我们可以使用 <code>[]</code> 索引符号来从一个指定列中获取值列表。</p>
<pre><code class="language-python">covid_data_dict['new_cases']
# [1444, 1365, 996, 975, 1326]

covid_df['new_cases']
# 0         0.0
# 1         0.0
# 2         0.0
# 3         0.0
# 4         0.0
#         ...  
# 243    1444.0
# 244    1365.0
# 245     996.0
# 246     975.0
# 247    1326.0
# Name: new_cases, Length: 248, dtype: float64
</code></pre>
<p>每一列都用名为 <code>Series</code> 的数据结构来表示，它本质上是一个包含额外方法和属性的 numpy 数组。</p>
<pre><code class="language-python">type(covid_df['new_cases'])
# pandas.core.series.Series
</code></pre>
<p>与数组一样，你也可以使用索引符号 <code>[]</code> 通过系列检索特定值。</p>
<pre><code class="language-python">covid_df['new_cases'][246]
# 975.0

covid_df['new_tests'][240]
57640.0
</code></pre>
<p>Pandas 还提供了 <code>.at</code> 方法，可直接检索特定行和列的元素。</p>
<pre><code class="language-python">covid_df.at[246, 'new_cases']
# 975.0

covid_df.at[240, 'new_tests']
# 57640.0
</code></pre>
<p>除了使用索引符号 <code>[]</code>, Pandas 也允许使用 <code>.</code> 符号来将列作为数据帧的属性进行访问。但是，这个方法仅限于那些不包含空字符或者特殊字符的列。</p>
<pre><code>covid_df.new_cases
# 0         0.0
# 1         0.0
# 2         0.0
# 3         0.0
# 4         0.0
#         ...  
# 243    1444.0
# 244    1365.0
# 245     996.0
# 246     975.0
# 247    1326.0
# Name: new_cases, Length: 248, dtype: float64
</code></pre>
<p>更进一步，你可以传递一个列的列表到索引符号 <code>[]</code> 中，用来访问这些列的数据帧的子集。</p>
<pre><code class="language-python">cases_df = covid_df[['date', 'new_cases']]
cases_df
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-111.png" class="kg-image" alt="image-111" width="600" height="400" loading="lazy"></figure>
<p>新的数据帧 <code>cases_df</code> 只是原始数据帧 <code>covid_df</code> 的“视图”。两者都指向计算机内存中相同的数据。在其中一个更改值，另一个相应的值也会被更改。</p>
<p>在数据帧之间共享数据使得 Pandas 中的数据操作速度非常快。每次想要操作现有数据帧来创建新数据帧时，你都不必担心复制数千或数百万行导致的性能开销。</p>
<p>有些时候你需要数据帧的完整副本，这时你可以使用 <code>copy</code> 方法。</p>
<pre><code class="language-python">covid_df_copy = covid_df.copy()
</code></pre>
<p><code>covid_df_copy</code> 中的数据与 <code>covid_df</code> 的是完全分开的，改变其中一个的值并不会影响另一个。</p>
<p>要访问特定的数据行，Pandas 提供了<code>.loc</code> 方法。</p>
<pre><code class="language-python">covid_df
</code></pre>
<pre><code class="language-python">covid_df.loc[243]
# date          2020-08-30
# new_cases         1444.0
# new_deaths           1.0
# new_tests        53541.0
# Name: 243, dtype: object
</code></pre>
<p>检索到的每一行也是一个 <code>Series</code> 对象。</p>
<pre><code class="language-python">type(covid_df.loc[243])
# pandas.core.series.Series
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-112.png" class="kg-image" alt="image-112" width="600" height="400" loading="lazy"></figure>
<p>我们可以使用 <code>.head</code> 和 <code>.tail</code> 方法查看数据的前几行或最后几行。</p>
<pre><code class="language-python">covid_df.head(5)
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-113.png" class="kg-image" alt="image-113" width="600" height="400" loading="lazy"></figure>
<pre><code class="language-python">covid_df.tail(4)
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-114.png" class="kg-image" alt="image-114" width="600" height="400" loading="lazy"></figure>
<p>要注意的是，在 <code>new_cases</code> 和 <code>new_deaths</code> 列中，刚开始的一些值是 <code>0</code>，但是在 <code>new_tests</code> 列中对应的值是 <code>NaN</code>。那是因为这个 CSV 文件本身并没有特定日期的 <code>new_tests</code> 列的数据（你可以通过查看文件来验证这一点）。这些值可能缺失或未知。</p>
<pre><code class="language-python">covid_df.at[0, 'new_tests']
# nan

type(covid_df.at[0, 'new_tests'])
# numpy.float64
</code></pre>
<p><code>0</code> 和 <code>NaN</code> 之间的区别很微妙但很重要。在此数据集中，它表示在指定日期没有报告每日测试数量。意大利从 2020 年 4 月 19 日开始报告每日测试数据。在 4 月 19 日之前，他们已经进行了 935,310 次测试。</p>
<p>我们可以使用列的 <code>first_valid_index</code> 方法找到不包含 <code>NaN</code> 值的第一个索引。</p>
<pre><code class="language-python">covid_df.new_tests.first_valid_index()
# 111
</code></pre>
<p>让我们查看此索引前后的几行，以验证值是否从 <code>NaN</code> 更改为实际数字。我们可以向<code>loc</code>传递一个范围来实现查看。</p>
<pre><code class="language-python">covid_df.loc[108:113]
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-115.png" class="kg-image" alt="image-115" width="600" height="400" loading="lazy"></figure>
<p>我们可以使用 <code>.sample</code> 方法从数据帧中获取随机抽样行。</p>
<pre><code class="language-python">covid_df.sample(10)
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-116.png" class="kg-image" alt="image-116" width="600" height="400" loading="lazy"></figure>
<p>注意，尽管我们采取了随机样品，每一行的原始索引都被保留了。这是数据帧非常有用的一个属性。</p>
<p>下面是本节我们看到的函数和方法的总结：</p>
<ul>
<li><code>covid_df['new_cases']</code> – 使用列名将列当作 <code>Series</code> 来检索</li>
<li><code>new_cases[243]</code> – 使用索引从 <code>Series</code> 中检索值</li>
<li><code>covid_df.at[243, 'new_cases']</code> – 从数据帧中检索单个值</li>
<li><code>covid_df.copy()</code> – 创建数据帧的深度副本</li>
<li><code>covid_df.loc[243]</code> - 从数据帧中检索数据行或数据行范围</li>
<li><code>head</code>、<code>tail</code> 和 <code>sample</code> – 从数据帧中检索多行数据</li>
<li><code>covid_df.new_tests.first_valid_index</code> – 查找序列中的第一个非空索引</li>
</ul>
<h3 id="pandas">如何分析 Pandas 数据帧中的数据</h3>
<p>让我们尝试回答这些数据的一些问题。</p>
<p><strong>问：关于意大利新冠肺炎，总的确诊病例和死亡人数是多少？</strong></p>
<p>与 Numpy 数组类似，Pandas 序列支持 <code>sum</code> 方法，这个问题也就回答了。</p>
<pre><code class="language-python">total_cases = covid_df.new_cases.sum()
total_deaths = covid_df.new_deaths.sum()

print('The number of reported cases is {} and the number of reported deaths is {}.'.format(int(total_cases), int(total_deaths)))
# The number of reported cases is 271515 and the number of reported deaths is 35497.
</code></pre>
<p><strong>问：总的死亡率是多少（报告的死亡数除以确诊病例）？</strong></p>
<pre><code class="language-python">death_rate = covid_df.new_deaths.sum() / covid_df.new_cases.sum()

print("The overall reported death rate in Italy is {:.2f} %.".format(death_rate*100))
# The overall reported death rate in Italy is 13.07 %.
</code></pre>
<p><strong>问：进行测试的总人数是多少？在报告每日测试数量之前，共进行了 935</strong>，<strong>310 次测试。</strong></p>
<pre><code class="language-python">initial_tests = 935310
total_tests = initial_tests + covid_df.new_tests.sum()

total_tests
# 5214766.0
</code></pre>
<p><strong>问：哪些部分测试结果为阳性？</strong></p>
<pre><code class="language-python">positive_rate = total_cases / total_tests

print('{:.2f}% of tests in Italy led to a positive diagnosis.'.format(positive_rate*100))
# 5.21% of tests in Italy led to a positive diagnosis.
</code></pre>
<p>尝试提问回答关于这些数据更多的问题。</p>
<h3 id="pandas">如何在 Pandas 中对行进行查询和排序</h3>
<p>假设我们只想查看确诊病例大于 1，000 的日子。那么可以使用布尔表达式来检查哪些行满足此条件。</p>
<pre><code class="language-python">high_new_cases = covid_df.new_cases &gt; 1000

high_new_cases
# 0      False
# 1      False
# 2      False
# 3      False
# 4      False
#        ...  
# 243     True
# 244     True
# 245    False
# 246    False
# 247     True
# Name: new_cases, Length: 248, dtype: bool
</code></pre>
<p>布尔表达式返回一个包含 <code>True</code> 和 <code>False</code> 布尔值的序列。你可以使用这个序列从原始数据帧中选择行的子集，对应于这个序列中的 <code>True</code> 值。</p>
<p><code>covid_df[high_new_cases]</code></p>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-117.png" class="kg-image" alt="image-117" width="600" height="400" loading="lazy"></figure>
<p>这个数据帧包含 72 行，但是为了简洁起见，默认情况下 Jupyter 只显示前五行和后五行。我们可以更改一些显示选项，来查看所有行。</p>
<pre><code class="language-python">high_cases_df = covid_df[covid_df.new_cases &gt; 1000]

high_cases_df
</code></pre>
<p>我们还可以制定涉及多个列的更复杂的查询。例如，尝试确定确诊病例除以测试数量的比例高于总的 <code>positive_rate</code> 的日子。</p>
<pre><code class="language-python">positive_rate
# 0.05206657403227681

high_ratio_df = covid_df[covid_df.new_cases / covid_df.new_tests &gt; positive_rate]

high_ratio_df
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-120.png" class="kg-image" alt="image-120" width="600" height="400" loading="lazy"></figure>
<p>对两列进行操作的结果是一个新数列。</p>
<pre><code class="language-python">covid_df.new_cases / covid_df.new_tests
# 0           NaN
# 1           NaN
# 2           NaN
# 3           NaN
# 4           NaN
#          ...   
# 243    0.026970
# 244    0.032055
# 245    0.018311
# 246         NaN
# 247         NaN
# Length: 248, dtype: float64
</code></pre>
<p>我们可以使用该系列为数据帧添加新列。</p>
<pre><code class="language-python">covid_df['positive_rate'] = covid_df.new_cases / covid_df.new_tests

covid_df
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-121.png" class="kg-image" alt="image-121" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-121.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-121.png 625w" width="600" height="400" loading="lazy"></figure>
<p>但是，请记住，有时需要一些日子才能获得测试结果，因此，我们不能对同一天的新增病例数和测试数量进行比较。基于 <code>positive_rate</code> 列的任何推断都可能是不正确的。</p>
<p>注意这些微妙的联系是非常重要的，通常 CSV 文件中不会传达这些关系，而需要外部的上下文环境。通读数据集附带的文档或询问更多的信息，不失为一个好主意。</p>
<p>现在，让我们使用 <code>drop</code> 方法来移除 <code>positive_rate</code> 列。</p>
<pre><code class="language-python">covid_df.drop(columns=['positive_rate'], inplace=True)
</code></pre>
<p>你能指出 <code>inplace</code> 参数的目的吗？</p>
<h4 id="pandas"><strong>如何在 Pandas 中使用列值对行进行排序</strong></h4>
<p>你可以使用 <code>.sort_values</code> 通过一个指定的列来对行进行排序。让我们排序以确定病例数最多的天数，然后使用 <code>head</code> 方法将其链接起来，只列出前十个结果。</p>
<pre><code class="language-python">covid_df.sort_values('new_cases', ascending=False).head(10)
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-122.png" class="kg-image" alt="image-122" width="600" height="400" loading="lazy"></figure>
<p>看起来 3 月最后两周的每日病例数最多。让我们来对比所记录的死亡人数最多的日子。</p>
<pre><code class="language-python">covid_df.sort_values('new_deaths', ascending=False).head(10)
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-123.png" class="kg-image" alt="image-123" width="600" height="400" loading="lazy"></figure>
<p>可以发现，每日死亡人数的顶峰出现在每日病例达到顶峰之后的一周。</p>
<p>我们也来看看病例数最少的日子。我们也许会想到一年中最开始的几天会出现在列表上。</p>
<pre><code class="language-python">covid_df.sort_values('new_cases').head(10)
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-124.png" class="kg-image" alt="image-124" width="600" height="400" loading="lazy"></figure>
<p>2020 年 6 月 20 日的新病例数似乎是 <code>-148</code>，一个负数！这跟我们预想的不一样，但这就是现实世界数据的本质。这可能是一个数据输入的错误，或者政府可能为了解决过去的计算错误而作的一个更正。</p>
<p>你能在网上挖掘新闻文章并找出这个数字为什么是负数吗？</p>
<p>让我们再来看看 2020 年 6 月 20 日前后的几天。</p>
<pre><code class="language-python">covid_df.loc[169:175]
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-125.png" class="kg-image" alt="image-125" width="600" height="400" loading="lazy"></figure>
现在，我们假设这实际上是一个数据输入错误。我们可以使用以下的其中一个方法来处理缺失值或错误值：
<ol>
<li>将其替换为 <code>0</code></li>
<li>将其替换为整列的平均值</li>
<li>将其替换为前后两个日期的平均值</li>
<li>删除该行</li>
</ol>
<p>选择哪种方法需要有关数据和问题的一些背景信息。在本例中，由于我们正在处理按日期排序的数据，我们可以继续使用第三种方法。</p>
<p>你可以使用 <code>.at</code> 方法来修改数据帧中指定的值。</p>
<pre><code class="language-python">covid_df.at[172, 'new_cases'] = (covid_df.at[171, 'new_cases'] + covid_df.at[173, 'new_cases'])/2
</code></pre>
<p>以下是我们在本节中看到的函数和方法的汇总：</p>
<ul>
<li><code>covid_df.new_cases.sum()</code> – 计算列或系列中值的总和</li>
<li><code>covid_df[covid_df.new_cases &gt; 1000]</code> – 使用布尔表达式查询满足所选条件的行子集</li>
<li><code>df['pos_rate'] = df.new_cases/df.new_tests</code> – 通过合并现有列中的数据来添加新列</li>
<li><code>covid_df.drop('positive_rate')</code> – 从数据帧中删除一列或多列</li>
<li><code>sort_values</code> – 使用列值对数据帧的行进行排序</li>
<li><code>covid_df.at[172, 'new_cases'] = ...</code> – 替换数据帧中的值</li>
</ul>
<h3 id="pandas">如何处理 Pandas 中的日期</h3>
<p>虽然我们已经查看了病例、测试、阳性率等这些总体的数字，但按月研究这些数字也很有用。</p>
<p><code>date</code> 列在这里可能会派上用场，因为 Pandas 提供了许多用于处理日期的实用程序。</p>
<pre><code class="language-python">covid_df.date
# 0      2019-12-31
# 1      2020-01-01
# 2      2020-01-02
# 3      2020-01-03
# 4      2020-01-04
#           ...    
# 243    2020-08-30
# 244    2020-08-31
# 245    2020-09-01
# 246    2020-09-02
# 247    2020-09-03
# Name: date, Length: 248, dtype: object
</code></pre>
<p>当前日期的数据类型是 <code>object</code>，因此 Pandas 不知道这一列是日期。我们用 <code>pd.to_datetime</code> 方法将它转成 <code>datetime</code> 列。</p>
<pre><code class="language-python">covid_df['date'] = pd.to_datetime(covid_df.date)

covid_df['date']
# 0     2019-12-31
# 1     2020-01-01
# 2     2020-01-02
# 3     2020-01-03
# 4     2020-01-04
#          ...    
# 243   2020-08-30
# 244   2020-08-31
# 245   2020-09-01
# 246   2020-09-02
# 247   2020-09-03
# Name: date, Length: 248, dtype: datetime64[ns]
</code></pre>
<p>现在你可以看到它的数据类型是 <code>datetime64</code>。我们用 <code>DatetimeIndex</code> 类将数据的不同部分提取到单独的列中。(<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fpandas.pydata.org%2Fpandas-docs%2Fversion%2F0.23.4%2Fgenerated%2Fpandas.DatetimeIndex.html">查看文档</a>)。</p>
<pre><code class="language-python">covid_df['year'] = pd.DatetimeIndex(covid_df.date).year
covid_df['month'] = pd.DatetimeIndex(covid_df.date).month
covid_df['day'] = pd.DatetimeIndex(covid_df.date).day
covid_df['weekday'] = pd.DatetimeIndex(covid_df.date).weekday

covid_df
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-126.png" class="kg-image" alt="image-126" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-126.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-126.png 735w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<p>我们来看一下 5 月份的整体指标。通过查询五月的行，选择其列的子集，并使用 <code>sum</code> 方法来合计每个选定列的值。</p>
<pre><code class="language-python"># 查询五月份的记录
covid_df_may = covid_df[covid_df.month == 5]

# 提取要汇总的列子集
covid_df_may_metrics = covid_df_may[['new_cases', 'new_deaths', 'new_tests']]

# 按列求和
covid_may_totals = covid_df_may_metrics.sum()

covid_may_totals
# new_cases       29073.0
# new_deaths       5658.0
# new_tests     1078720.0
# dtype: float64

type(covid_may_totals)
# pandas.core.series.Series
</code></pre>
<p>我们还可以将上述操作合并为一条语句。</p>
<pre><code class="language-python">covid_df[covid_df.month == 5][['new_cases', 'new_deaths', 'new_tests']].sum()
# new_cases       29073.0
# new_deaths       5658.0
# new_tests     1078720.0
# dtype: float64
</code></pre>
<p>再举一个例子，让我们检查一下周日报告的病例数是否高于每天报告的平均病例数。这次，我们可能要使用 <code>.mean</code> 方法对列进行汇总。</p>
<pre><code class="language-python"># 总平均值
covid_df.new_cases.mean()

# 1096.6149193548388

# 周日平均数
covid_df[covid_df.weekday == 6].new_cases.mean()

# 1247.2571428571428
</code></pre>
<p>与其他日子相比，星期天所报告的病例看起来更多。</p>
<p>尝试提问回答更多的数据中有关日期的问题。</p>
<h3 id="pandas">如何在 Pandas 中分组和聚合数据</h3>
<p>下一步，如果我们想要汇总逐日的数据，还要创建一个包含逐月数据的新数据帧。我们可以用 <code>groupby</code> 函数来为每一个月创建一个组，然后选择我们想要聚合的列，并用 <code>sum</code> 方法来聚合。</p>
<pre><code class="language-python">covid_month_df = covid_df.groupby('month')[['new_cases', 'new_deaths', 'new_tests']].sum()

covid_month_df
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-127.png" class="kg-image" alt="image-127" width="600" height="400" loading="lazy"></figure>
<p>结果是一个新的数据帧，它使用传递给 <code>groupby</code> 的列中的唯一值作为索引。分组与聚合是非常有用的方法，用于逐步将数据汇总为更小的数据帧。</p>
<p>除了按总和聚合之外，还可以按平均值等其他方式进行聚合。让我们分别来计算每个月每日新增病例、死亡人数和检测数的平均值。</p>
<pre><code class="language-python">covid_month_mean_df = covid_df.groupby('month')[['new_cases', 'new_deaths', 'new_tests']].mean()

covid_month_mean_df
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-128.png" class="kg-image" alt="image-128" width="600" height="400" loading="lazy"></figure>
<p>除了分组之外，另一种聚合形式是计算截止到每行日期的病例、测试或死亡的累积总和。我们可以使用 <code>cumsum</code> 方法计算某一列的累积总和并作为一个新的系列。</p>
<p>我们来添加新的三列：<code>total_cases</code>，<code>total_deaths</code> 和 <code>total_tests</code>。</p>
<pre><code class="language-python">covid_df['total_cases'] = covid_df.new_cases.cumsum()
covid_df['total_deaths'] = covid_df.new_deaths.cumsum()
covid_df['total_tests'] = covid_df.new_tests.cumsum() + initial_tests
</code></pre>
<p>我们还在 <code>total_test</code> 中加入了初始测试次数，以反映每日报告开始前进行的测试。</p>
<p><code>covid_df</code></p>
<figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-129.png" class="kg-image" alt="image-129" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-129.png 600w, https://www.freecodecamp.org/news/content/images/size/w1000/2021/10/image-129.png 1000w, https://www.freecodecamp.org/news/content/images/2021/10/image-129.png 1065w" width="600" height="400" loading="lazy"></figure>
<p>注意 <code>total_tests</code> 列中的 <code>NaN</code> 值是如何保持不被影响的。</p>
<h3 id="pandas">如何在 Pandas 中合并来自多个来源的数据</h3>
<p>要确定其他指标，例如每百万人口的测试人数、每百万人口的确诊病例数等，我们需要该国家/地区的更多信息，即其人口。</p>
<p>让我们来下载另一个文件 <code>locations.csv</code>，它包含了包括意大利在内的许多国家的健康相关信息。</p>
<pre><code class="language-python">urlretrieve('https://gist.githubusercontent.com/aakashns/8684589ef4f266116cdce023377fc9c8/raw/99ce3826b2a9d1e6d0bde7e9e559fc8b6e9ac88b/locations.csv', 'locations.csv')

locations_df = pd.read_csv('locations.csv')
locations_df
</code></pre>
<figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-130.png" class="kg-image" alt="image-130" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-130.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-130.png 928w" width="600" height="400" loading="lazy"></figure>
<pre><code class="language-python">locations_df[locations_df.location == "Italy"]
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-131.png" class="kg-image" alt="image-131" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-131.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-131.png 877w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<p>通过添加更多的列，我们可以将这些数据合并到先前的数据中。但是，要合并两个数据帧，我们至少需要一个共同的列。因此，我们在 <code>covid_df</code> 数据帧中插入 <code>location</code> 列，并将该列的所有值设为 <code>“Italy”</code>。</p>
<pre><code class="language-python">covid_df['location'] = "Italy"

covid_df
</code></pre>
<figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-132.png" class="kg-image" alt="image-132" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-132.png 600w, https://www.freecodecamp.org/news/content/images/size/w1000/2021/10/image-132.png 1000w, https://www.freecodecamp.org/news/content/images/2021/10/image-132.png 1142w" width="600" height="400" loading="lazy"></figure>
现在，我们可以使用 `.merge` 方法将 `locations_df` 中的列添加到 `covid_df` 中。
<pre><code class="language-python">merged_df = covid_df.merge(locations_df, on="location")

merged_df
</code></pre>
<figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-133.png" class="kg-image" alt="image-133" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-133.png 600w, https://www.freecodecamp.org/news/content/images/size/w1000/2021/10/image-133.png 1000w, https://www.freecodecamp.org/news/content/images/2021/10/image-133.png 1358w" sizes="(min-width: 1200px) 1200px" width="600" height="400" loading="lazy"><figcaption>Check out the full data frame <a href="https://jovian.ai/embed?url=https://jovian.ai/aakashns/python-pandas-data-analysis">here</a>.</figcaption></figure>
<p>在<a href="https://jovian.com/embed?url=https://jovian.ai/aakashns/python-pandas-data-analysis">这里</a>查看完整的数据。</p>
<p>在 <code>covid_df</code> 中，每一行都附加上了意大利的位置信息。如果 <code>covid_df</code> 数据帧中包含了多个地区的数据，那么每一行应该附加上相应国家的位置信息。</p>
<p>现在，我们就可以计算每百万人口的病例数、死亡人数以及测试人数这些指标了。</p>
<pre><code class="language-python">merged_df['cases_per_million'] = merged_df.total_cases * 1e6 / merged_df.population
merged_df['deaths_per_million'] = merged_df.total_deaths * 1e6 / merged_df.population
merged_df['tests_per_million'] = merged_df.total_tests * 1e6 / merged_df.population

merged_df
</code></pre>
<figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-134.png" class="kg-image" alt="image-134" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-134.png 600w, https://www.freecodecamp.org/news/content/images/size/w1000/2021/10/image-134.png 1000w, https://www.freecodecamp.org/news/content/images/2021/10/image-134.png 1405w" sizes="(min-width: 1200px) 1200px" width="600" height="400" loading="lazy"><figcaption>Check out the full data frame <a href="https://jovian.ai/embed?url=https://jovian.ai/aakashns/python-pandas-data-analysis">here</a>.</figcaption></figure>
<p>在<a href="https://jovian.com/embed?url=https://jovian.ai/aakashns/python-pandas-data-analysis">这里</a>查看完整的数据。</p>
<h3 id="pandas">如何用 Pandas 将数据写回到文件中</h3>
<p>在完成分析，添加新列之后，你需要将结果写回到文件中。否则，一旦 Jupter notebook 关闭后，数据就会丢失。</p>
<p>在写入文件之前，让我们先创建一个只包含我们希望记录的列的数据帧。</p>
<pre><code class="language-python">result_df = merged_df[['date',
                       'new_cases', 
                       'total_cases', 
                       'new_deaths', 
                       'total_deaths', 
                       'new_tests', 
                       'total_tests', 
                       'cases_per_million', 
                       'deaths_per_million', 
                       'tests_per_million']]
                       
result_df
</code></pre>
<figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-135.png" class="kg-image" alt="image-135" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-135.png 600w, https://www.freecodecamp.org/news/content/images/size/w1000/2021/10/image-135.png 1000w, https://www.freecodecamp.org/news/content/images/2021/10/image-135.png 1279w" sizes="(min-width: 1200px) 1200px" width="600" height="400" loading="lazy"></figure>
<p>要将数据帧中的数据写入文件，我们可以使用 <code>to_csv</code> 函数。</p>
<pre><code class="language-python">result_df.to_csv('results.csv', index=None)
</code></pre>
<p><code>to_csv</code> 函数默认还包含一列用于存储数据帧索引的额外列。我们通过 <code>index=None</code> 来关闭这种行为。现在可以验证 <code>results.csv</code> 是否已创建，并包含 CSV 格式数据帧中的数据：</p>
<pre><code class="language-python">date,new_cases,total_cases,new_deaths,total_deaths,new_tests,total_tests,cases_per_million,deaths_per_million,tests_per_million
2020-02-27,78.0,400.0,1.0,12.0,,,6.61574439992122,0.1984723319976366,
2020-02-28,250.0,650.0,5.0,17.0,,,10.750584649871982,0.28116913699665186,
2020-02-29,238.0,888.0,4.0,21.0,,,14.686952567825108,0.34732658099586405,
2020-03-01,240.0,1128.0,8.0,29.0,,,18.656399207777838,0.47964146899428844,
2020-03-02,561.0,1689.0,6.0,35.0,,,27.93498072866735,0.5788776349931067,
2020-03-03,347.0,2036.0,17.0,52.0,,,33.67413899559901,0.8600467719897585,
</code></pre>
<h3 id="pandas">奖励：使用 Pandas 进行基本绘图</h3>
<p>通常在 Jupyter notebook 中，我们使用像 <code>matplotlib</code> 或 <code>seaborn</code> 这样的库来绘图。但是，Pandas 数据帧和序列提供了便利的 <code>.plot</code> 方法来进行快速简单地绘图。</p>
<p>我们来绘制一个折线图，显示每日病例数如何随时间变化。</p>
<pre><code class="language-python">result_df.new_cases.plot();
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-137.png" class="kg-image" alt="image-137" width="600" height="400" loading="lazy"></figure>
<p>虽然此图显示了整体趋势，但很难判断峰值发生的位置，因为 X 轴上没有日期。我们可以使用 <code>date</code> 列作为数据帧的索引来解决这个问题。</p>
<pre><code class="language-python">result_df.set_index('date', inplace=True)

result_df
</code></pre>
<figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-138.png" class="kg-image" alt="image-138" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-138.png 600w, https://www.freecodecamp.org/news/content/images/size/w1000/2021/10/image-138.png 1000w, https://www.freecodecamp.org/news/content/images/2021/10/image-138.png 1237w" sizes="(min-width: 1200px) 1200px" width="600" height="400" loading="lazy"></figure>
注意数据帧的索引并非必须是数值，使用日期作为索引，同样可以通过 `.loc` 获取指定日期的数据。
<pre><code class="language-python">result_df.loc['2020-09-01']
# new_cases             9.960000e+02
# total_cases           2.696595e+05
# new_deaths            6.000000e+00
# total_deaths          3.548300e+04
# new_tests             5.439500e+04
# total_tests           5.214766e+06
# cases_per_million     4.459996e+03
# deaths_per_million    5.868661e+02
# tests_per_million     8.624890e+04
# Name: 2020-09-01 00:00:00, dtype: float64
</code></pre>
<p>下面我们将每天的新病例和新死亡人数绘制为折线图。</p>
<pre><code class="language-python">result_df.new_cases.plot()
result_df.new_deaths.plot();
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-139.png" class="kg-image" alt="image-139" width="600" height="400" loading="lazy"></figure>
<p>我们还可以比较总病例数和总死亡人数。</p>
<pre><code class="language-python">result_df.total_cases.plot()
result_df.total_deaths.plot();
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-140.png" class="kg-image" alt="image-140" width="600" height="400" loading="lazy"></figure>
<p>让我们看看死亡率和阳性检测率如何随时间变化的。</p>
<pre><code class="language-python">death_rate = result_df.total_deaths / result_df.total_cases

death_rate.plot(title='Death Rate');
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-141.png" class="kg-image" alt="image-141" width="600" height="400" loading="lazy"></figure>
<pre><code class="language-python">positive_rates = result_df.total_cases / result_df.total_tests

positive_rates.plot(title='Positive Rate');
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-142.png" class="kg-image" alt="image-142" width="600" height="400" loading="lazy"></figure>
<p>最后，我们来绘制逐月数据的条形图，以在更高的层次上查看趋势。</p>
<pre><code class="language-python">covid_month_df.new_cases.plot(kind='bar');
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-143.png" class="kg-image" alt="image-143" width="600" height="400" loading="lazy"></figure>
<pre><code class="language-python">covid_month_df.new_tests.plot(kind='bar')
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-144.png" class="kg-image" alt="image-144" width="600" height="400" loading="lazy"></figure>
<h3 id="pandas">Pandas 练习</h3>
<p>尝试以下练习，以熟悉 Pandas 数据帧，并锻炼你的技术：</p>
<ul>
<li><a href="https://jovian.ml/aakashns/pandas-practice-assignment">Pandas 数据帧任务</a></li>
<li><a href="https://github.com/guipsamora/pandas_exercises">Pandas 附加练习</a></li>
<li><a href="https://www.kaggle.com/datasets">尝试从 Kaggle 下载并分析数据</a></li>
</ul>
<h3 id="">总结及延展阅读</h3>
<p>在本教程中，我们涵盖了以下主题：</p>
<ul>
<li>如何将 CSV 文件读入到 Pandas 数据帧中</li>
<li>如何从 Pandas 数据帧中检索数据</li>
<li>如何查询、排序和分析数据</li>
<li>如何合并、分组和聚合数据</li>
<li>如何从日期中提取有用的信息</li>
<li>使用折线图和条形图进行基本绘图</li>
<li>如何将数据帧写入到 CSV 文件中</li>
</ul>
<p>查看以下资源以了解 Pandas 的更多信息：</p>
<ul>
<li><a href="https://pandas.pydata.org/docs/user_guide/index.html">Pandas 用户指南</a></li>
<li><a href="https://www.oreilly.com/library/view/python-for-data/9781491957653/">Python 数据分析（Wes McKinney 的书 —— 他是 Pandas 的创建者）</a></li>
</ul>
<h3 id="pandas">查看问题以检验你对 Pandas 的理解</h3>
<p>尝试回答以下问题，来测验你对本章所涵盖的主题的理解：</p>
<ol>
<li>Pandas 是什么？有用在哪里？</li>
<li>如何安装 Pandas 库？</li>
<li>如何导入 <code>pandas</code> 模块？</li>
<li>导入 <code>pandas</code> 模块后，它的常用别名是什么？</li>
<li>如果用 Pandas 读入 CSV 文件？请举例。</li>
<li>用 Pandas 还可以读入哪些文件格式？举例说明。</li>
<li>Pandas 数据帧是什么？</li>
<li>Pandas 数据帧与 Numpy 数组的区别是什么？</li>
<li>在数据帧中如何找到行数和列数？</li>
<li>如何在数据帧中获取列的列表？</li>
<li>数据帧中<code>describe</code> 方法的作用是什么？</li>
<li><code>info</code> 和 <code>describe</code> 这两个数据帧方法的区别是什么？</li>
<li>Pandas 数据帧在概念上与字典列表或列表字典相似吗？举例解释。</li>
<li>Pandas 中的 <code>Series</code> 是什么？它跟 Numpy 数组的区别是什么？</li>
<li>如何访问数据帧中的列？</li>
<li>如何访问数据帧中的行？</li>
<li>如何访问数据帧中指定的行和列中的元素？</li>
<li>如何创建具有特定列集的数据帧子集？</li>
<li>如何创建具有特定行范围的数据帧子集？</li>
<li>更改数据帧内的值，是否会影响使用行或列的子集所创建的其他数据帧？为什么？</li>
<li>如何创建数据帧的副本？</li>
<li>为什么要避免创建太多的数据帧副本？</li>
<li>如何查看数据帧中的开头几行？</li>
<li>如何查看数据帧中的末尾几行？</li>
<li>如何在数据帧中选择随机行？</li>
<li>数据帧中的“索引”是什么？如何有用？</li>
<li>Pandas 数据帧中的 <code>NaN</code> 值代表什么意思？</li>
<li><code>Nan</code> 和 <code>0</code> 的区别是什么？</li>
<li>在 Pandas 序列或列中，如何识别第一个非空行？</li>
<li><code>df.loc</code> and <code>df.at</code> 的区别是什么？</li>
<li>在哪里可以找到 Pandas 中 <code>DataFrame</code> 和 <code>Series</code> 对象所支持的全部方法列表？</li>
<li>如何在数据帧的列中找到数字的总和？</li>
<li>如何找到数据帧列中数字的平均值？</li>
<li>如何找到数据帧列中非空数字的数量？</li>
<li>在布尔表达式中使用 Pandas 列可以得到什么结果？举例说明。</li>
<li>如何选择行子集，使得其指定的列值满足给定的条件？举例说明。</li>
<li>表达式 <code>df[df.new_cases &gt; 100]</code> 的结果是什么？</li>
<li>如何在 Jupyter 单元格输出中显示 pandas 数据帧的所有行？</li>
<li>对数据帧中的两列执行算术运算，会得到什么结果？举例说明。</li>
<li>如何通过组合两个现有列的值，在数据帧中添加新列？举例说明。</li>
<li>如何删除数据帧中的列？举例说明。</li>
<li>在数据帧方法中 <code>inplace</code> 参数的作用是什么？</li>
<li>如何基于一个特定列中的值来对数据帧的行进行排序？</li>
<li>如果利用多个列中的值来对 pandas 数据帧进行排序？</li>
<li>在对 Pandas 数据帧排序时，如何指定是按升序还是降序来排序？</li>
<li>如何修改数据帧中指定的值？</li>
<li>如何将数据帧的列转换成 <code>datetime</code> 数据类型？</li>
<li>使用 <code>datetime</code> 数据类型而不用 <code>object</code> 的好处是什么？</li>
<li>如何将日期列的不同部分（如月、年、月、工作日等）提取到单独的列中？举例说明。</li>
<li>如何聚合数据帧的多个列？</li>
<li>数据帧的 <code>groupby</code> 方法的作用是什么？举例说明。</li>
<li>聚合用 <code>groupby</code> 创建的组有哪些不同的方式？</li>
<li>运行或累积总和是什么意思？</li>
<li>如何创建一个新列，包含另一列的运行或累积总和？</li>
<li>Pandas 数据帧还支持哪些其他的累积方法？</li>
<li>合并两个数据帧是什么意思？举例说明。</li>
<li>如何指定用于合并两个数据帧的列？</li>
<li>如何将 Pandas 数据帧的数据写入到 CSV 文件中？请举个例子。</li>
<li>还可以将 Pandas 数据帧写入到哪些文件格式中？举例说明。</li>
<li>如何创建折线图，用于显示数据帧中列的值？</li>
<li>如何将数据帧的列转换为其索引？</li>
<li>数据帧的索引可以是非数字吗？</li>
<li>使用非数字数据帧的好处是什么？举例说明。</li>
<li>如何创建条形图，用于显示数据帧中列的值？</li>
<li>Pandas 数据帧和系列还支持哪些其他类型的绘图方法？</li>
</ol>
<p>你已经准备好进入本教程的下一部分了。</p>
<h2 id="pythonmatplotlibseaborn">使用 Python、Matplotlib 和 Seaborn 进行数据可视化</h2>
<p><img src="https://i.imgur.com/9i806Rh.png" alt="9i806Rh" width="2314" height="1092" loading="lazy"></p>
<p>Notebook 链接：<a href="https://jovian.ai/aakashns/python-matplotlib-data-visualization">https://jovian.ai/aakashns/python-matplotlib-data-visualization</a></p>
<p>数据可视化是对数据的图形化呈现。它生成图片，将要呈现的数据之间的关系传递给读者。</p>
<p>可视化数据是数据分析和机器学习的重要部分。我们将使用 Python 库 <a href="https://jovian.ai/outlink?url=https%3A%2F%2Fmatplotlib.org">Matplotlib</a> 和 <a href="https://jovian.ai/outlink?url=https%3A%2F%2Fseaborn.pydata.org">Seaborn</a> 来学习和应用一些常用的数据可视化技术。在本教程中，我们会交替使用 <strong>chart</strong>，<strong>plot</strong> 和 <strong>graph</strong> 这三个词。</p>
<p>开始前，我们需要先安装并导入这些库。<code>matplotlib.pyplot</code> 模块用于基本的绘图，如折线图和条形图，导入后通常使用别名 <code>plt</code> 。<code>seaborn</code> 模块用于更高级的绘图，导入后通常使用别名 <code>sns</code>。</p>
<pre><code class="language-python">!pip install matplotlib seaborn --upgrade --quiet

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
</code></pre>
<p>注意我们还包含了特殊命令 <code>%matplotlib inline</code>，确保所绘的图内嵌在 Jupyter notebook 中显示。如果不使用这条命令，有时图形会以弹窗显示。</p>
<h3 id="python">如何在 Python 中创建折线图</h3>
<p>折线图是最简单、应用最广泛的数据可视化技术之一。折线图将信息显示为由直线连接的一系列数据点或标记。</p>
<p>你可以自定义线条和标记的形状、大小、颜色和其他美学元素，以获得更好的视觉清晰度。</p>
<p>下面是一个 Python 列表，显示了一个名为 Kanto 的虚构国家在六年内的苹果产量（吨/公顷）。</p>
<pre><code class="language-python">yield_apples = [0.895, 0.91, 0.919, 0.926, 0.929, 0.931]
</code></pre>
<p>我们可以使用折线图来可视化苹果的产量如何随时间变化。我们使用 <code>plt.plot</code> 函数来绘制折线图。</p>
<pre><code class="language-python">plt.plot(yield_apples)
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-145.png" class="kg-image" alt="image-145" width="600" height="400" loading="lazy"></figure>
<p>调用 <code>plt.plot</code> 函数就能绘制预期的折线图，同时它还返回了绘制的绘图列表 <code>[&lt;matplotlib.lines.Line2D at 0x7ff70aa20760&gt;]</code>，会显示在输出区域。我们可以在单元格中最后一条语句的末尾添加分号（<code>;</code>），使得只显示图形而不显示输出内容。</p>
<pre><code class="language-python">plt.plot(yield_apples);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-146.png" class="kg-image" alt="image-146" width="600" height="400" loading="lazy"></figure>
让我们一步一步来增强这个图形，使它更具信息性和美感。
<h4 id="matplotlibx">如何在 MatPlotLib 中自定义 X 轴</h4>
<p>当前图形的 X 轴显示了列表元素的索引 0 到 5。如果我们可以显示数据中的年份，这个图形将更具信息性。通过 <code>plt.plot</code> 中的两个参数即可实现。</p>
<pre><code class="language-python">years = [2010, 2011, 2012, 2013, 2014, 2015]
yield_apples = [0.895, 0.91, 0.919, 0.926, 0.929, 0.931]

plt.plot(years, yield_apples)
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-147.png" class="kg-image" alt="image-147" width="600" height="400" loading="lazy"></figure>
#### MatPlotLib 中的坐标标签
<p>通过 <code>plt.xlabel</code> 和 <code>plt.ylabel</code> 这两个函数，我们可以为坐标添加标签，来显示坐标代表的意义。</p>
<pre><code class="language-python">plt.plot(years, yield_apples)
plt.xlabel('Year')
plt.ylabel('Yield (tons per hectare)');
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-148.png" class="kg-image" alt="image-148" width="600" height="400" loading="lazy"></figure>
<h4 id="matplotlib">如何在 MatPlotLib 中绘制多条折线</h4>
<p>你可以为每条线调用一次 <code>plt.plot</code> 函数，这样就可以在同一个图形中绘制多条折线。让我们来比较 Kanto 苹果与橘子的产量。</p>
<pre><code class="language-python">years = range(2000, 2012)
apples = [0.895, 0.91, 0.919, 0.926, 0.929, 0.931, 0.934, 0.936, 0.937, 0.9375, 0.9372, 0.939]
oranges = [0.962, 0.941, 0.930, 0.923, 0.918, 0.908, 0.907, 0.904, 0.901, 0.898, 0.9, 0.896, ]

plt.plot(years, apples)
plt.plot(years, oranges)
plt.xlabel('Year')
plt.ylabel('Yield (tons per hectare)');
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-149.png" class="kg-image" alt="image-149" width="600" height="400" loading="lazy"></figure>
<h4 id="matplotlib">MatPlotLib 中的图表标题和图例</h4>
<p>为了区分不同的线条，我们可以使用 <code>plt.legend</code> 函数在图形中添加一个图例。我们还可以使用 <code>plt.title</code> 函数来设置图表的标题。</p>
<pre><code class="language-python">plt.plot(years, apples)
plt.plot(years, oranges)

plt.xlabel('Year')
plt.ylabel('Yield (tons per hectare)')

plt.title("Crop Yields in Kanto")
plt.legend(['Apples', 'Oranges']);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-150.png" class="kg-image" alt="image-150" width="600" height="400" loading="lazy"></figure>
<h4 id="matplotlib">如何在 MatPlotLib 中使用线条标记</h4>
<p>通过使用 <code>plt.plot</code> 的<code>marker</code> 参数，我们还可以为每条线上的数据点增添标记。</p>
<p>Matplotlib 提供许多不同的标记，如圆圈、叉号、方块和菱形等。你可以从这个链接找到所有标记类型的列表：<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fmatplotlib.org%2F3.1.1%2Fapi%2Fmarkers_api.html">https://matplotlib.org/3.1.1/api/markers_api.html</a> 。</p>
<pre><code class="language-python">plt.plot(years, apples, marker='o')
plt.plot(years, oranges, marker='x')

plt.xlabel('Year')
plt.ylabel('Yield (tons per hectare)')

plt.title("Crop Yields in Kanto")
plt.legend(['Apples', 'Oranges']);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-151.png" class="kg-image" alt="image-151" width="600" height="400" loading="lazy"></figure>
<h4 id="matplotlib">如何在 MatPlotLib 中设置线条和标记的样式</h4>
<p><code>plt.plot</code> 函数提供很多参数用于设置线条和标记的样式：</p>
<ul>
<li><code>color</code> 或 <code>c</code> – 设置线条颜色 (<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fmatplotlib.org%2F3.1.0%2Fgallery%2Fcolor%2Fnamed_colors.html">支持的颜色</a>)</li>
<li><code>linestyle</code> 或 <code>ls</code> – 选择是实线还是虚线</li>
<li><code>linewidth</code> 或 <code>lw</code> – 设置线条宽度</li>
<li><code>markersize</code> 或 <code>ms</code> – 设置标记尺寸</li>
<li><code>markeredgecolor</code> 或 <code>mec</code> – 设置标记的边缘颜色</li>
<li><code>markeredgewidth</code> 或 <code>mew</code> – 设置标记的边缘宽度</li>
<li><code>markerfacecolor</code> 或 <code>mfc</code> – 设置标记的填充颜色</li>
<li><code>alpha</code> – 图形的不透明度</li>
</ul>
<p>查阅 <code>plt.plot</code> 的文档以学习更多内容：<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fmatplotlib.org%2Fapi%2F_as_gen%2Fmatplotlib.pyplot.plot.html%23matplotlib.pyplot.plot">https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib.pyplot.plot</a> 。</p>
<pre><code class="language-python">plt.plot(years, apples, marker='s', c='b', ls='-', lw=2, ms=8, mew=2, mec='navy')
plt.plot(years, oranges, marker='o', c='r', ls='--', lw=3, ms=10, alpha=.5)

plt.xlabel('Year')
plt.ylabel('Yield (tons per hectare)')

plt.title("Crop Yields in Kanto")
plt.legend(['Apples', 'Oranges']);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-152.png" class="kg-image" alt="image-152" width="600" height="400" loading="lazy"></figure>
<p><code>fmt</code> 参数提供了便捷的方法来设置标记的颜色、线条样式和颜色。你可以将它作为 <code>plt.plot</code> 的第三参数。</p>
<pre><code class="language-python">fmt = '[marker][line][color]'

plt.plot(years, apples, 's-b')
plt.plot(years, oranges, 'o--r')

plt.xlabel('Year')
plt.ylabel('Yield (tons per hectare)')

plt.title("Crop Yields in Kanto")
plt.legend(['Apples', 'Oranges']);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-153.png" class="kg-image" alt="image-153" width="600" height="400" loading="lazy"></figure>
<p>你可以使用 <code>plt.figure</code> 函数来改变图形的大小。</p>
<pre><code class="language-python">plt.plot(years, oranges, 'or')
plt.title("Yield of Oranges (tons per hectare)");
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-154.png" class="kg-image" alt="image-154" width="600" height="400" loading="lazy"></figure>
<h4 id="matplotlib">如何在 MatPlotLib 中更改图形的尺寸</h4>
<p>你可以使用 <code>plt.figure</code> 函数来更改图形的尺寸。</p>
<pre><code class="language-python">plt.figure(figsize=(12, 6))

plt.plot(years, oranges, 'or')
plt.title("Yield of Oranges (tons per hectare)");
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-155.png" class="kg-image" alt="image-155" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-155.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-155.png 996w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<h4 id="seaborn">如何使用 Seaborn 改进默认样式</h4>
<p>使用 Seaborn 库中的一些默认样式，很容易让你的图表看起来更加漂亮。你可以全局使用 <code>sns.set_style</code> 函数。以下是预定义样式的完整列表：<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fseaborn.pydata.org%2Fgenerated%2Fseaborn.set_style.html">https://seaborn.pydata.org/generated/seaborn.set_style.html</a> 。</p>
<pre><code class="language-python">sns.set_style("whitegrid")
plt.plot(years, apples, 's-b')
plt.plot(years, oranges, 'o--r')

plt.xlabel('Year')
plt.ylabel('Yield (tons per hectare)')

plt.title("Crop Yields in Kanto")
plt.legend(['Apples', 'Oranges']);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-156.png" class="kg-image" alt="image-156" width="600" height="400" loading="lazy"></figure>
<pre><code class="language-python">sns.set_style("darkgrid")

plt.plot(years, apples, 's-b')
plt.plot(years, oranges, 'o--r')

plt.xlabel('Year')
plt.ylabel('Yield (tons per hectare)')

plt.title("Crop Yields in Kanto")
plt.legend(['Apples', 'Oranges']);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-157.png" class="kg-image" alt="image-157" width="600" height="400" loading="lazy"></figure>
<pre><code class="language-python">plt.plot(years, oranges, 'or')
plt.title("Yield of Oranges (tons per hectare)");
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-158.png" class="kg-image" alt="image-158" width="600" height="400" loading="lazy"></figure>
<p>你还可以通过修改 <code>matplotlib.rcParams</code> 字典直接编辑默认样式。了解更多信息：<a href="https://matplotlib.org/3.2.1/tutorials/introductory/customizing.html#matplotlib-rcparams">https://matplotlib.org/3.2.1/tutorials/introductory/customizing.html#matplotlib-rcparams</a> 。</p>
<pre><code class="language-python">import matplotlib

matplotlib.rcParams['font.size'] = 14
matplotlib.rcParams['figure.figsize'] = (9, 5)
matplotlib.rcParams['figure.facecolor'] = '#00000000'
</code></pre>
<h3 id="matplotlib">MatPlotLib 中的散点图</h3>
<p>在散点图中，两个变量的值被绘成二维网格上的一个点。此外，你还可以使用第三个变量来确定这些点的大小和颜色。让我们来试一个例子。</p>
<p><a href="https://jovian.ai/outlink?url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FIris_flower_data_set">鸢尾花卉数据集</a> 提供了三种花的花萼和花瓣的样本测量。该数据集包含了 Seaborn 库，你可以把它当作 Pandas 数据帧来加载。</p>
<pre><code class="language-python"># 将数据加载到 Pandas 数据帧中
flowers_df = sns.load_dataset("iris")

flowers_df
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-159.png" class="kg-image" alt="image-159" width="600" height="400" loading="lazy"></figure>
<pre><code class="language-python">flowers_df.species.unique()
# array(['setosa', 'versicolor', 'virginica'], dtype=object)
</code></pre>
<p>让我们尝试将萼片长度和萼片宽度之间的关系可视化。我们的第一反应可能是使用 <code>plt.plot</code> 创建一个折线图。</p>
<pre><code class="language-python">plt.plot(flowers_df.sepal_length, flowers_df.sepal_width);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-160.png" class="kg-image" alt="image-160" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-160.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-160.png 758w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<p>由于数据集中有太多两个属性的组合，因此输出的信息不是很丰富。它们之间看上去并不是简单的关系。</p>
<p>通过 <code>seaborn</code> 模块（以别名 <code>sns</code> 导入）中的 <code>scatterplot</code> 函数，我们用散点图可视化花萼长度和宽度是如何变化的。</p>
<pre><code class="language-python">sns.scatterplot(x=flowers_df.sepal_length, y=flowers_df.sepal_width);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-161.png" class="kg-image" alt="image-161" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-161.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-161.png 774w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<h4 id="matplotlib">如何在 MatPlotLib 中添加色调</h4>
<p>注意，上图中有些点形成了一些异常值的不同簇。我们可以将这三个花的品种各自当作一个<code>色调</code>来给这些点上色，还可以用 <code>s</code> 参数来放大这些点。</p>
<pre><code class="language-python">sns.scatterplot(x=flowers_df.sepal_length, y=flowers_df.sepal_width, hue=flowers_df.species, s=100);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-162.png" class="kg-image" alt="image-162" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-162.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-162.png 778w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<p>添加色调使得图形更具信息性。我们可以立刻看出，刚毛鸢尾的花萼较短，但是较宽。而弗吉尼亚鸢尾正好相反。</p>
<h4 id="seaborn">如何自定义 Seaborn 图形</h4>
<p>由于 Seaborn 内部用的是 Matplotlib 的绘图函数，我们可以使用像 <code>plt.figure</code> 和 <code>plt.title</code> 这样的函数来修改图形。</p>
<pre><code class="language-python">plt.figure(figsize=(12, 6))
plt.title('Sepal Dimensions')

sns.scatterplot(x=flowers_df.sepal_length, 
                y=flowers_df.sepal_width, 
                hue=flowers_df.species,
                s=100);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-163.png" class="kg-image" alt="image-163" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-163.png 600w, https://www.freecodecamp.org/news/content/images/size/w1000/2021/10/image-163.png 1000w, https://www.freecodecamp.org/news/content/images/2021/10/image-163.png 1007w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<h4 id="seabornpandas">如何使用带有 Seaborn 的 Pandas 数据帧绘制数据</h4>
<p>Seaborn 内置了对 Pandas 数据帧的支持。你可以提供列名并使用 <code>data</code> 参数来指定数据帧，无需将每一列作为序列来传递。</p>
<pre><code class="language-python">plt.title('Sepal Dimensions')
sns.scatterplot(x='sepal_length', 
                y='sepal_width', 
                hue='species',
                s=100,
                data=flowers_df);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-164.png" class="kg-image" alt="image-164" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-164.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-164.png 783w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<h3 id="matplotlib">MatPlotLib 中的直方图</h3>
<p>直方图通过沿值的范围创建组距（间隔）并显示垂直条来表示每个组距中的观察数，从而表示变量的分布。</p>
<p>例如，我们要可视化鸢尾花数据集中花萼宽度值的分布。我们可以使用 <code>plt.hist</code> 函数来创建直方图。</p>
<pre><code class="language-python"># 将数据加载到 Pandas 数据帧中
flowers_df = sns.load_dataset("iris")

flowers_df.sepal_width
# 0      3.5
# 1      3.0
# 2      3.2
# 3      3.1
# 4      3.6
#       ... 
# 145    3.0
# 146    2.5
# 147    3.0
# 148    3.4
# 149    3.0
# Name: sepal_width, Length: 150, dtype: float64
</code></pre>
<pre><code class="language-python">plt.title("Distribution of Sepal Width")
plt.hist(flowers_df.sepal_width);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-165.png" class="kg-image" alt="image-165" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-165.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-165.png 753w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<p>我们能立马发现花萼的宽度在 2.0 - 4.5 范围内，大约有 35 个落在 2.9 - 3.1 之间，它们似乎是最多的组距。</p>
<h4 id="">如何控制组距的大小和数量</h4>
<p>我们可以使用组距参数来控制组距的数量以及每个组距的大小。</p>
<pre><code class="language-python"># Specifying the number of bins
plt.hist(flowers_df.sepal_width, bins=5);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-166.png" class="kg-image" alt="image-166" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-166.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-166.png 756w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<pre><code class="language-python">import numpy as np

# Specifying the boundaries of each bin
plt.hist(flowers_df.sepal_width, bins=np.arange(2, 5, 0.25));
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-167.png" class="kg-image" alt="image-167" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-167.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-167.png 744w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<pre><code class="language-python"># Bins of unequal sizes
plt.hist(flowers_df.sepal_width, bins=[1, 3, 4, 4.5]);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-168.png" class="kg-image" alt="image-168" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-168.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-168.png 741w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<h4 id="matplotlib">如何在 MatPlotLib 中管理多个直方图</h4>
<p>与折线图类似，我们可以在一个图表里绘制多个直方图。我们可以降低每个直方图的不透明度，这样每个直方图里的柱条不会遮住其他的。</p>
<p>让我们来为每一个花的品种绘制自己的直方图。</p>
<pre><code class="language-python">setosa_df = flowers_df[flowers_df.species == 'setosa']
versicolor_df = flowers_df[flowers_df.species == 'versicolor']
virginica_df = flowers_df[flowers_df.species == 'virginica']

plt.hist(setosa_df.sepal_width, alpha=0.4, bins=np.arange(2, 5, 0.25));
plt.hist(versicolor_df.sepal_width, alpha=0.4, bins=np.arange(2, 5, 0.25));
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-169.png" class="kg-image" alt="image-169" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-169.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-169.png 735w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<p>我们还可以将多个直方图堆叠在一起。</p>
<pre><code class="language-python">plt.title('Distribution of Sepal Width')

plt.hist([setosa_df.sepal_width, versicolor_df.sepal_width, virginica_df.sepal_width], 
         bins=np.arange(2, 5, 0.25), 
         stacked=True);

plt.legend(['Setosa', 'Versicolor', 'Virginica']);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-170.png" class="kg-image" alt="image-170" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-170.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-170.png 744w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<h3 id="matplotlib">MatPlotLib 中的条</h3>
<p>条形图与折线图很像，都显示一系列的值。只不过，每个值都会显示一个条形，而不是由线连接的点。我们可以使用 <code>plt.bar</code> 函数来绘制条形图。</p>
<pre><code class="language-python">years = range(2000, 2006)
apples = [0.35, 0.6, 0.9, 0.8, 0.65, 0.8]
oranges = [0.4, 0.8, 0.9, 0.7, 0.6, 0.8]

plt.bar(years, oranges);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-171.png" class="kg-image" alt="image-171" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-171.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-171.png 750w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<p>与直方图一样，我们可以将条形图堆叠在一起。我们使用 <code>plt.bar</code> 的 <code>bottom</code> 参数来实现这一目的。</p>
<pre><code class="language-python">plt.bar(years, apples)
plt.bar(years, oranges, bottom=apples);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-172.png" class="kg-image" alt="image-172" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-172.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-172.png 754w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<h4 id="seaborn">Seaborn 中包含平均值的条形图</h4>
<p>我们来看另一个包含 Seaborn 的样本数据集，名为 <code>tips</code>。这个数据集包含有关一周内访问餐厅的客户的性别、时间、总账单和小费金额的信息。</p>
<pre><code class="language-python">tips_df = sns.load_dataset("tips");

tips_df
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-173.png" class="kg-image" alt="image-173" width="600" height="400" loading="lazy"></figure>
<p>我们可能想要绘制一个条形图来可视化平均账单金额在一周中的不同天数之间的变化。实现的一种方式是计算每日的平均值，然后使用<code>plt.bar</code>（请当做练习来尝试）。</p>
<p>然而，由于这是一个非常普遍的用例，Seaborn 库提供了 <code>barplot</code> 函数，可以自动计算平均值。</p>
<pre><code class="language-python">sns.barplot(x='day', y='total_bill', data=tips_df);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-174.png" class="kg-image" alt="image-174" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-174.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-174.png 770w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<p>切割每个条形的线表示值的变化量。例如，看起来总账单的变化在周五相对较高，而在周六较低。</p>
<p>我们还可以指定一个 <code>hue</code> 参数来并排比较基于第三个特征的条形图，例如性别。</p>
<pre><code class="language-python">sns.barplot(x='day', y='total_bill', hue='sex', data=tips_df);
</code></pre>
<pre><code class="language-python">sns.barplot(x='total_bill', y='day', hue='sex', data=tips_df);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-175.png" class="kg-image" alt="image-175" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-175.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-175.png 772w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<p>只需切换坐标轴，就能使条形图水平显示。</p>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-176.png" class="kg-image" alt="image-176" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-176.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-176.png 784w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<h3 id="seaborn">Seaborn 中的热度</h3>
<p>热图用于可视化二维数据，如使用颜色的矩阵或表格。理解它的最好方式就是具体看一个例子。</p>
<p>我们将使用另一个 Seaborn 的样本数据集，叫做 <code>flights</code>，来可视化机场在过去12年中的乘客流量。</p>
<pre><code class="language-python">flights_df = sns.load_dataset("flights").pivot("month", "year", "passengers")

flights_df
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-177.png" class="kg-image" alt="image-177" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-177.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-177.png 728w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<p><code>flights_df</code> 是一个矩阵，一行表示一月，一列为一年。值显示了在一年中具体某个月到访机场的乘客数量（以千为计）。我们可以使用 <code>sns.heatmap</code> 函数来可视化机场的客流。</p>
<pre><code class="language-python">plt.title("No. of Passengers (1000s)")
sns.heatmap(flights_df);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-178.png" class="kg-image" alt="image-178" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-178.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-178.png 737w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<p>颜色越明亮，表示机场客流量越大。通过这个图，我们可以推断两件事：</p>
<ul>
<li>在所有给定的年份中，机场客流总是在七八月份达到最高。</li>
<li>每个月机场的客流量都会逐年增加。</li>
</ul>
<p>我们还可以通过指定 <code>annot=True</code> 来显示每个块的实际值，使用 <code>cmap</code> 参数来改变调色板。</p>
<pre><code class="language-python">plt.title("No. of Passengers (1000s)")
sns.heatmap(flights_df, fmt="d", annot=True, cmap='Blues');
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-179.png" class="kg-image" alt="image-179" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-179.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-179.png 731w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<h3 id="matplotlib">MatPlotLib 中的图片</h3>
<p>我们还可以用 Matplotlib 来显示图片。我们先从网上下载一张图片。</p>
<pre><code class="language-python">from urllib.request import urlretrieve

urlretrieve('https://i.imgur.com/SkPbq.jpg', 'chart.jpg');
</code></pre>
<p>在显示图像之前，必须使用 <code>PIL</code> 模块将图像读入内存。</p>
<pre><code class="language-python">from PIL import Image

img = Image.open('chart.jpg')
</code></pre>
<p>使用 PIL 加载的图像是一个简单的三维 numpy 数组，包含图像红、绿、蓝（RGB）通道的像素强度。我们可以使用 <code>np.array</code> 将图像转换为数组。</p>
<pre><code class="language-python">img_array = np.array(img)

img_array.shape
# (481, 640, 3)
</code></pre>
<p>我们可以使用 <code>plt.imshow</code> 显示 PIL 图像。</p>
<pre><code class="language-python">plt.imshow(img);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-180.png" class="kg-image" alt="image-180" width="600" height="400" loading="lazy"></figure>
<p>我们可以使用相关函数关闭坐标轴和网格线，并显示标题。</p>
<pre><code class="language-python">plt.grid(False)
plt.title('A data science meme')
plt.axis('off')
plt.imshow(img);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-181.png" class="kg-image" alt="image-181" width="600" height="400" loading="lazy"></figure>
<p>要显示图像的一部分，我们只需从 numpy 数组中选择一个片段即可。</p>
<pre><code class="language-python">plt.grid(False)
plt.axis('off')
plt.imshow(img_array[125:325,105:305]);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-182.png" class="kg-image" alt="image-182" width="600" height="400" loading="lazy"></figure>
<h3 id="matplotlibseaborn">MatPlotLib 和 Seaborn 中如何绘制多个图表</h3>
<p>Matplotlib 和 Seaborn 还支持在网格中绘制多个图表，通过使用 <code>plt.subplots</code>，返回用于绘图的轴的系列。</p>
<p>以下单个网格中显示了本教材涵盖的各种不同类型的图表。</p>
<pre><code class="language-python">fig, axes = plt.subplots(2, 3, figsize=(16, 8))

# Use the axes for plotting
axes[0,0].plot(years, apples, 's-b')
axes[0,0].plot(years, oranges, 'o--r')
axes[0,0].set_xlabel('Year')
axes[0,0].set_ylabel('Yield (tons per hectare)')
axes[0,0].legend(['Apples', 'Oranges']);
axes[0,0].set_title('Crop Yields in Kanto')


# Pass the axes into seaborn
axes[0,1].set_title('Sepal Length vs. Sepal Width')
sns.scatterplot(x=flowers_df.sepal_length, 
                y=flowers_df.sepal_width, 
                hue=flowers_df.species, 
                s=100, 
                ax=axes[0,1]);

# Use the axes for plotting
axes[0,2].set_title('Distribution of Sepal Width')
axes[0,2].hist([setosa_df.sepal_width, versicolor_df.sepal_width, virginica_df.sepal_width], 
         bins=np.arange(2, 5, 0.25), 
         stacked=True);

axes[0,2].legend(['Setosa', 'Versicolor', 'Virginica']);

# Pass the axes into seaborn
axes[1,0].set_title('Restaurant bills')
sns.barplot(x='day', y='total_bill', hue='sex', data=tips_df, ax=axes[1,0]);

# Pass the axes into seaborn
axes[1,1].set_title('Flight traffic')
sns.heatmap(flights_df, cmap='Blues', ax=axes[1,1]);

# Plot an image using the axes
axes[1,2].set_title('Data Science Meme')
axes[1,2].imshow(img)
axes[1,2].grid(False)
axes[1,2].set_xticks([])
axes[1,2].set_yticks([])

plt.tight_layout(pad=2);
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-183.png" class="kg-image" alt="image-183" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-183.png 600w, https://www.freecodecamp.org/news/content/images/size/w1000/2021/10/image-183.png 1000w, https://www.freecodecamp.org/news/content/images/2021/10/image-183.png 1383w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<p>通过该网页查看支持函数的完整列表：<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fmatplotlib.org%2F3.3.1%2Fapi%2Faxes_api.html%23the-axes-class">https://matplotlib.org/3.3.1/api/axes_api.html#the-axes-class</a> 。</p>
<h4 id="seaborn">用 Seaborn 来配对绘图</h4>
<p>Seaborn 还提供了一个助手函数 <code>sns.pairplot</code>，用于在一个数据帧内自动绘制多个不同的图表，以显示多个特征对。</p>
<pre><code class="language-python">sns.pairplot(flowers_df, hue='species');
</code></pre>
<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-184.png" class="kg-image" alt="image-184" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-184.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-184.png 987w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>See the full output <a href="https://jovian.ai/embed?url=https://jovian.ai/aakashns/python-matplotlib-data-visualization/">here</a>.</figcaption></figure>
<pre><code class="language-python">sns.pairplot(tips_df, hue='sex');
</code></pre>
<figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-185.png" class="kg-image" alt="image-185" srcset="https://www.freecodecamp.org/news/content/images/size/w600/2021/10/image-185.png 600w, https://www.freecodecamp.org/news/content/images/2021/10/image-185.png 748w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure>
<h3 id="">总结及扩展阅读</h3>
<p>本教程涵盖了以下主题：</p>
<ul>
<li>如何使用 Matplotlib 来创建和自定义折线图</li>
<li>如何使用散点图可视化两个或多个变量之间的关系</li>
<li>如何使用直方图和条形图研究变量的分布</li>
<li>如何使用热图可视化二维数据</li>
<li>如何使用 Matplotlib 的 <code>plt.imshow</code> 显示图像</li>
<li>如何在一个网格中显示多个 Matplotlib 和 Seaborn 图表</li>
</ul>
<p>在本章中，我们学习了使用 Matplotlib 和 Seaborn 进行数据可视化的一些基本概念和常用技术。数据可视化是一个很宽泛的领域，我们在这里几乎还没有触及其表层。查阅以下参考文献来学习探索更多内容：</p>
<ul>
<li>数据可视化备忘单：<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fjovian.ml%2Faakashns%2Fdataviz-cheatsheet">https://jovian.ml/aakashns/dataviz-cheatsheet</a></li>
<li>Seaborn 资料：<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fseaborn.pydata.org%2Fexamples%2Findex.html">https://seaborn.pydata.org/examples/index.html</a></li>
<li>Matplotlib 资料：<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fmatplotlib.org%2F3.1.1%2Fgallery%2Findex.html">https://matplotlib.org/3.1.1/gallery/index.html</a></li>
<li>Matplotlib 教程：<a href="https://jovian.ai/outlink?url=https%3A%2F%2Fgithub.com%2Frougier%2Fmatplotlib-tutorial">https://github.com/rougier/matplotlib-tutorial</a></li>
</ul>
<h3 id="">回顾问题来检验你的掌握程度</h3>
<p>尝试回答以下问题来测试你对本文所涵盖的主题的理解程度：</p>
<ol>
<li>数据可视化是什么？</li>
<li>Matplotlib是什么？</li>
<li>Seaborn是什么？</li>
<li>如何安装 Matplotlib 和 Seaborn？</li>
<li>如何导入 Matplotlib 和 Seaborn？导入这两个模块时常用的别名是什么？</li>
<li>神奇命令 <code>%matplotlib inline</code> 的作用是什么？</li>
<li>什么是折线图？</li>
<li>如何在 Python 中绘制折线图？举例说明。</li>
<li>如何指定折线图 X 轴的值？</li>
<li>如何为图表的轴指定标签？</li>
<li>如何在同一轴上绘制多个折线图？</li>
<li>如何显示包含多个线条的折线图的图例？</li>
<li>如何设置图表的标题？</li>
<li>如何显示折线图的标记？</li>
<li>折线图中线条和标记的样式有哪些不同的选项？举例说明。</li>
<li><code>plt.plot</code> 中 <code>fmt</code> 参数的作用是什么？</li>
<li>在哪能找到可以被 <code>plt.plot</code> 接受的所有参数的列表？</li>
<li>如何使用 Matplotlib 更改图形的大小？</li>
<li>如何将 Seaborn 的默认样式应用于全局所有的图表？</li>
<li>Seaborn 中可用的预定义样式有哪些？举例说明。</li>
<li>什么是散点图？</li>
<li>散点图与折线图有何不同？</li>
<li>如何使用 Seaborn 绘制散点图？举例说明。</li>
<li>如何判断什么时候使用散点图和折线图？</li>
<li>如何使用分类变量为散点图上的点指定颜色？</li>
<li>如何为 Seaborn 绘图自定义标题、图形大小、图例等？</li>
<li>如何使用带有 <code>sns.scatterplot</code> 的 Pandas 数据框？</li>
<li>什么是直方图？</li>
<li>什么时候应该使用直方图和折线图？</li>
<li>如何使用 Matplotlib 绘制直方图？举例说明。</li>
<li>直方图中的“组距”是什么？</li>
<li>如何更改直方图中组距的数量？</li>
<li>如何更改直方图中组距的大小？</li>
<li>如何在同一轴上显示多个直方图？</li>
<li>如何将多个直方图堆叠在一起？</li>
<li>什么是条形图？</li>
<li>如何使用 Matplotlib 绘制条形图？举例说明。</li>
<li>条形图和直方图的区别是什么？</li>
<li>条形图和折线图的区别是什么？</li>
<li>你如何将条形堆叠在一起？</li>
<li><code>plt.bar</code> 和 <code>sns.barplot</code> 的区别是什么？</li>
<li>在 Seaborn 条形图中，分割柱状条的线条代表了什么？</li>
<li>如何并排显示条形图？</li>
<li>如何绘制水平条形图？</li>
<li>什么是热图？</li>
<li>什么类型的数据最好用热图来进行可视化？</li>
<li>Pandas 数据帧中的 <code>pivot</code> 方法是干什么用的？</li>
<li>如何用 Seaborn 来绘制热图？举例说明。</li>
<li>如何更改热图的颜色方案？</li>
<li>如何显示热图中数据集的原始值？</li>
<li>如何用 Python 从 URL 下载图片？</li>
<li>如何用 Python 打开图片以用于处理？</li>
<li>Python 中 <code>PIL</code> 模块的作用是什么？</li>
<li>如何将 PIL 下载的图片转换成 Numpy 数组？</li>
<li>图片的 Numpy 数组有几维？每个维度代表什么？</li>
<li>图片中的“颜色通道”是什么意思？</li>
<li>什么是 RGB？</li>
<li>如何用 Matplotlib 显示图片？</li>
<li>如何关闭图表中的轴和网格线？</li>
<li>如何使用 Matplotlib 显示部分图片？</li>
<li>如何用 Matplotlib 和 Seaborn 在单个网格中绘制多个图表？举例说明。</li>
<li><code>plt.subplots</code> 函数的作用是什么？</li>
<li>什么是 Seaborn 的配对绘图？举例说明。</li>
<li>如何用 Matplotlib 将图表导出到 PNG 图片？</li>
<li>在哪里可以学到能用 Matplotlib 和 Seaborn创建的不同类型的图表？</li>
</ol>
<p>祝贺你完成本教程的学习！现在，你可以应用这些技能来分析来自以下来源的真实世界数据集：<a href="https://kaggle.com/datasets">Kaggle</a>。</p>
<p>如果你想从事数据科学和机器学习的工作，可以考虑加入<a href="https://jovian.ai/zero-to-data-science-bootcamp">从零开始数据科学训练营（约维安）</a>。这是一个为期20周的业余课程，你将完成7门课程、12个编码作业和4个真实的项目。你还将获得6个月的职业支持，以帮助你找到第一份数据科学工作。</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何开始从事数据分析工作——初学者的路线图 ]]>
                </title>
                <description>
                    <![CDATA[ 感谢共同译者：John Cheng [https://www.freecodecamp.org/chinese/news/author/john/] 欢迎来到数据分析的世界！如果您正在考虑从事于此，可算是找对地方了。数据分析作为一个迅猛发展、令人心潮澎湃的领域，在当今数据社会下愈发重要。 面对现实，我们已经被海量的数据淹没了。从社交媒体，到金融交易，再到医疗记录，不乏可供筛选的信息。 因此数据分析师们应运而生。他们帮助我们理解所有数据，并将其转化为有价值的见解。 这些见解可以是颠覆性的。它们能帮助企业改善产品和服务，帮助政府发布更明智的政策，帮助个人在私人生活和职场中做出更好的选择。 除了其影响力，数据分析也是一个十分赚钱的工作。最近研究表明，美国数据分析师的年薪中位数大约在$70,000，这个数字随着经验和技术实力增长可能会更高。 当然，与任何职业一样，数据分析也有其面临的挑战：偶尔令人头疼的数据集、长久的冒名顶替症威胁，以及关于最佳编程语言或数据可视化工具的无休止争论。嘿！但是如果您准备好迎接挑战，这可能是适合您的领域。 所以如果您正在努力成为一个数据分析师，这篇文章 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/data-analytics-roadmap/</link>
                <guid isPermaLink="false">64352fd5f3f6f8067537b424</guid>
                
                    <category>
                        <![CDATA[ 数据分析 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jiajun Jiao ]]>
                </dc:creator>
                <pubDate>Tue, 11 Apr 2023 10:09:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/04/christopher-gower-m_HRfLhgABo-unsplash.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/data-analytics-roadmap/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Get Started in Data Analytics – A Roadmap for Beginners</a>
      </p><!--kg-card-begin: markdown--><p>感谢共同译者：<a href="https://www.freecodecamp.org/chinese/news/author/john/">John Cheng</a></p>
<p>欢迎来到数据分析的世界！如果您正在考虑从事于此，可算是找对地方了。数据分析作为一个迅猛发展、令人心潮澎湃的领域，在当今数据社会下愈发重要。</p>
<p>面对现实，我们已经被海量的数据淹没了。从社交媒体，到金融交易，再到医疗记录，不乏可供筛选的信息。</p>
<p>因此数据分析师们应运而生。他们帮助我们理解所有数据，并将其转化为有价值的见解。</p>
<p>这些见解可以是颠覆性的。它们能帮助企业改善产品和服务，帮助政府发布更明智的政策，帮助个人在私人生活和职场中做出更好的选择。</p>
<p>除了其影响力，数据分析也是一个十分赚钱的工作。最近研究表明，美国数据分析师的年薪中位数大约在$70,000，这个数字随着经验和技术实力增长可能会更高。</p>
<p>当然，与任何职业一样，数据分析也有其面临的挑战：偶尔令人头疼的数据集、长久的冒名顶替症威胁，以及关于最佳编程语言或数据可视化工具的无休止争论。嘿！但是如果您准备好迎接挑战，这可能是适合您的领域。</p>
<p>所以如果您正在努力成为一个数据分析师，这篇文章为您量身打造。希望它能帮助您节省时间和精力，而不必像我一样浪费时间学习无关紧要的东西。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/03/tenor-1.gif" alt="图1" width="600" height="400" loading="lazy"></p>
<h2 id="">第一步：了解数据分析师的职责</h2>
<p>您正在考虑从事数据分析师职业吗？太棒了！在继续之前，让我们先花点时间了解一下它。</p>
<p>您看，数据分析师的工作不仅仅是处理图片和生成图表（即使这些也很酷）。它还涉及通过数据来洞察和解决问题。这意味着提出正确的问题，组织并评估数据，以及向他人解释您的结论。</p>
<p>数据分析师通常拥有的核心技能、参与的核心活动包括：</p>
<ul>
<li>收集并分析庞大数据集，为业务决策提供信息的模式、趋势和洞察。</li>
<li>使用统计工具和技术，从数据中得出洞察。</li>
<li>开发并实现数据收集系统，以及其他能优化效率和数据质量的策略。</li>
<li>与其他小组合作，确定业务需求并开发数据解决方案。</li>
<li>以清晰且可操作的方式与利益相关者交流自己的发现和洞察.</li>
</ul>
<p>所以如果您不是数学或计算机方面的天才，不要担心。统计、计算机科学和商学都只是数据分析跨学科主题中包含的一小部分。每个享受学习、解决问题并希望有所作为的人都能真正地享受其中。</p>
<p>那如何才能了解更多数据分析师的工作内容呢？您可以从众多线上免费资源入手。比如说，<a href="https://www.freecodecamp.org/news/what-does-a-data-analyst-do-data-analyst-job-description/">这篇文章讨论了数据分析师的实际工作</a>；<a href="https://www.freecodecamp.org/news/data-analyst-vs-data-scientist-whats-the-difference/">这篇文章讨论了数据分析和数据科学</a>。</p>
<p>许多博客、播客以及YouTube频道都提供数据分析相关的娱乐和资讯内容。我将会在下方列出一些多年来对我有帮助的YouTube频道。</p>
<p>要了解所需技能和素质，您还可以与其他数据分析师联系、参加会议或研讨会，并研究职位描述。</p>
<p>别忘了考虑一下您是否享受处理数据。您喜欢寻找规律和解决难题吗？您想让世界变得更美好吗？如果答案是肯定的，数据分析可能是您理想的职业选择。</p>
<p>您的第一步是了解数据分析师的工作。尽情享受，慢慢来，同时不要犹豫提出疑问。</p>
<h2 id="">第二步：探索数据分析师的工作要求</h2>
<p>现在您已经对数据分析师的职责有了更深理解，是时候开始了解雇主有什么需求了。毕竟，您想要确保您的技能和知识符合就业市场的需求。</p>
<p>但在您开始担心没有足够经验之前，请记住：每个公司都是不同的。有些可能更需要编程技能，另一些可能更看重沟通能力和商业头脑。因此，调研并找出您想要的行业或公司最需要哪些特定技能和条件十分重要。</p>
<p>所以如何才能找到此类信息呢？您可以从查看 LinkedIn、Indeed 和 Glassdoor 等求职网站上的职位列表及描述着手开始。</p>
<p>下面列出了一些职位要求示例：</p>
<ul>
<li>熟练掌握SQL并有大型数据集的工作经验</li>
<li>熟悉Python，熟悉Tableau、Power BI等数据可视化工具</li>
<li>拥有强大的分析能力并能从复杂数据中洞察信息</li>
<li>拥有统计分析和建模技术的经验</li>
<li>拥有卓越的沟通能力，以及向技术和非技术受众解释复杂发现的能力</li>
</ul>
<p>但是不要止步于此！您还可以联系在此领域工作或拥有您感兴趣职位的人。咨询他们的经验，以及他们认为哪些技能对他们的工作取得成功最为重要。您甚至可以尝试与他们安排非正式面试以了解更多此领域的信息，并获取从何入门的建议。</p>
<p>说到入门，一定要记住没有什么可以替代实践经验。尽管花所有时间观看教程可能很吸引人，但通过实际创建并上手真实的数据分析项目，您将更快更有效地学习。</p>
<p>因此，花些时间去探索工作要求，但不要忘了持续培养自己的技能并获得实践经验。付出一点努力，同时维持好奇心，您就能成为一名成功的数据分析师。</p>
<h2 id="">第三步：适应数学和统计学</h2>
<p>好吧，我知道您在想什么。数学和统计学？哎呀！</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/03/im-out-gif-11-1.gif" alt="动图11-1" width="600" height="400" loading="lazy"></p>
<p>但在知难而退前，请听我讲两句。一名数据分析师为了能够理解数据并从中获得有价值的洞悉，对这些概念有基本了解是必要的。</p>
<p>那么您应该熟悉哪些基本统计概念和公式呢？</p>
<p>现在，首先，有一些集中趋势的测量方法，被称为平均值、中位数和众数，它们可以让您了解数据集的典型值。您应该知道如何计算它们。</p>
<p>标准差是数据与平均值的分布差距的测量方法，您应该能够计算它。</p>
<p>为了找到变量之间的关系，并基于其联系生成预测，您还应该熟悉相关性和回归的概念。</p>
<p>但这不仅仅是数字。您还需要初步了解线性代数，它在许多数据分析方法中都有应用。<a href="https://www.freecodecamp.org/news/linear-algebra-full-course/">这里有一个深入的课程（以及教科书）</a>带领您入门。</p>
<p>您可能需要使用矩阵以修改和操作数据，或者您可能需要使用<a href="https://www.freecodecamp.org/news/data-science-with-python-8-ways-to-do-linear-regression-and-measure-their-speed-b5577d75f8b/">线性回归</a>以根据历史趋势预测未来数值。</p>
<p>如果您没有扎实的数学背景，这可能看起来很难。但别担心！有许多可用的资源能辅助您学习。</p>
<p>比如说，可汗学院（Khan Academy）提供数学和统计的课程和练习任务。如果您更喜欢书籍，Andrew Park 撰写的 “Data Science for Beginners” 是很棒的资源，它以易于理解的方式涵盖了统计和数学原理。</p>
<p>freeCodeCamp 也正在开发数学课程，<a href="https://www.freecodecamp.org/chinese/news/freecodecamp-foundational-math-curriculum/">您可以点击此处阅读</a>。</p>
<p>您还可以阅读<a href="https://www.freecodecamp.org/news/statistics-for-data-science/">《您需要了解的统计学指南》</a>，以进入数据科学领域、从事机器学习等领域。</p>
<p>千里之行，始于足下。关键是要从小处着手并逐渐积累知识。在您需要时，不要害怕提问或寻求帮助。只需稍加练习并坚持，您很快就会发现数学和统计学实际上挺有趣的（真的！）。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/03/raw.gif" alt="动图" width="600" height="400" loading="lazy"></p>
<h2 id="excel">第四步：精通 Excel 数据分析</h2>
<p>Excel 是数据分析师装备库中的重要工具。几乎每个组织都在使用它，而且掌握它可以帮助您轻松地清理、操作并分析数据。</p>
<p>使用 Excel，您可以创建公式和函数以进行计算、创建数据透视表和图表以可视化数据，以及使用数据分析工具预测并识别模式。Excel对于回归分析、预测和情景分析尤其有用。</p>
<p>如果您真的想成为一名数据分析师，那么掌握 Excel 是必要的。幸运的是，有大量可用的在线资源能帮助您学习。您可以在YouTube上观看教程 <a href="https://www.youtube.com/@excelisfun">ExcelIsFun</a>、<a href="https://www.youtube.com/playlist?list=PLmejDGrsgFyCZ4YC5s8mgdQztj7zt5to5">Excel Chandoo</a>、<a href="https://www.youtube.com/playlist?list=PLWPirh4EWFpEpO6NjjWLbKSCb-wx3hMql">Tutorials Point</a>、<a href="https://www.youtube.com/@AshutoshKumaryt">Ashutosh Kumar</a> 和 <a href="https://www.youtube.com/@MyOnlineTrainingHub">MyOnlineTrainingHub</a>。此外，以下课程将指导您如何充分利用 Excel。</p>
<ol>
<li><a href="https://www.coursera.org/learn/excel-data-analysis?irclickid=WskXxw2EKxyNRBjSCewfUQQZUkARwUz2LzeJ2A0&amp;irgwc=1&amp;utm_medium=partners&amp;utm_source=impact&amp;utm_campaign=1359419&amp;utm_content=b2c">使用 Excel 进行数据分析简介</a> Coursera</li>
<li><a href="https://www.freecodecamp.org/news/data-analysis-with-python-for-excel-users-course/">Excel 用户使用 Python 数据分析</a> freeCodeCamp 的 YouTube 频道</li>
<li><a href="https://www.coursera.org/specializations/excel?irclickid=WskXxw2EKxyNRBjSCewfUQQZUkARwUQvLzeJ2A0&amp;irgwc=1&amp;utm_medium=partners&amp;utm_source=impact&amp;utm_campaign=1359419&amp;utm_content=b2c">商业专业的 Excel 技能</a> Coursera</li>
<li><a href="https://www.edx.org/course/analyzing-and-visualizing-data-with-excel-2?irclickid=RrSQ3tWpyxyNTDdSXVVnIRUdUkARwR0WLzeJ2A0&amp;utm_source=affiliate&amp;utm_medium=guru99&amp;utm_campaign=Online%20Tracking%20Link_&amp;utm_content=ONLINE_TRACKING_LINK&amp;irgwc=1">使用 Excel 分析并可视化数据</a> EdX</li>
</ol>
<p>请记住，Excel 只是数据分析工具包中的工具之一。但它是您作为数据分析师每天都使用的重要工具。通过掌握 Excel，您将完全有能力处理遇到的任何数据相关的任务。</p>
<p>现在让我们学习下一项技能，这也是您作为数据分析师需要掌握的最重要技能之一。</p>
<h2 id="sql">第五步：熟练使用 SQL 提取数据</h2>
<p>SQL（结构化查询语言Structured Query Language）是一个在数据分析中重要的工具。作为一个数据分析师，您的主要责任包括从数据库中提取数据。SQL是帮助您实现该目的的编程语言。</p>
<p>SQL不仅限于执行像SELECT，FROM，和WHERE这样的基本查询。它是一个复杂的编程语言——您能用它以多种方式操纵和转化数据。SQL被用于从多个表格中合并数据，筛选提炼数据，和生成新的表格和视图。</p>
<p>为了成为一个高效的数据分析师，熟练掌握SQL非常重要。您需要能得心应手地查询数据，生成表格，并且理解如何使您的查询高效运行。</p>
<p>幸运的是，有很多帮助您学习SQL的资源。您能从以下平台开始您的学习：<a href="https://www.khanacademy.org/computing/computer-programming/sql/">可汗学院 SQL</a>、W3Schools、<a href="https://sqlzoo.net/wiki/SQL_Tutorial">SQLZoo</a>、<a href="https://sqlbolt.com/">SQLbolt</a>、<a href="https://www.youtube.com/@LukeBarousse">Luke Barousse</a>、<a href="https://www.youtube.com/@AlexTheAnalyst">Alex the Analyst</a>、<a href="https://www.youtube.com/@TheOyinbooke">Microsoft Power Tools</a>，最后，一些像 SQL island 和 SQL murder 这样的SQL游戏也能帮助您学习。</p>
<p>此外，还有很多现有的网课和书籍能够深入地覆盖SQL。以下是一些可以帮助您入门的例子：</p>
<ol>
<li><a href="https://www.freecodecamp.org/news/sql-and-databases-full-course/">学习SQL和数据库-初学者完整课程</a></li>
<li><a href="https://www.freecodecamp.org/news/learn-sql-free-relational-database-courses-for-beginners/#relational-database-freecodecamp-curriculum">来自freeCodeCamp的关系数据库课程</a></li>
<li><a href="https://www.freecodecamp.org/news/learn-sql-free-relational-database-courses-for-beginners/">免费的数据库课程系列</a></li>
</ol>
<p>通过熟练掌握SQL，您将能够从数据库中提取有价值的见解，并能操作数据以提供有意义的业务见解。</p>
<h2 id="python">第六步：针对数据分析学习 Python</h2>
<p>我了解有很多对于数据分析师是否需要学习 Python 的怀疑 —— 有人说要学，有人说不要。</p>
<p>对我而言，我更倾向于说这取决于您所在的公司 —— 但通过学习 Python 这种在数据分析中最广泛使用的编程语言以获得一技之长是不错的。Python 因它的简洁性、可读性和多功能性而出名。这使得它成为一个受数据分析师欢迎的选择。</p>
<p>Python 拥有着<a href="https://www.freecodecamp.org/news/python-data-science-course-matplotlib-pandas-numpy/">极为广泛的工具包和函数库</a>。 这些工具使得数据分析变得容易，比如说用于操纵和分析数据的 Pandas，和用于可视化数据的 Matplotlib。Python 也有着<a href="https://www.freecodecamp.org/news/python-automation-scripts/">自动化任务的能力</a>，这使数据分析变得更加简洁高效。</p>
<p><a href="https://www.freecodecamp.org/news/learn-data-analysis-with-python-course/">为数据分析学习Python</a> 是一个您在数据分析职业道路上的不错的投资。它不仅让您能使用强大的函数库工作，而且它还能为您提供不少机会，来分析更大的数据集和进行更复杂的分析。</p>
<p>从免费网课到付费的网络和纸质教程，有很多帮助您学习 Python 的资源。这些资源包括<a href="https://www.youtube.com/@freecodecamp">freeCodeCamp</a>、DataCamp、<a href="https://www.youtube.com/@codebasics">CodeBasis</a>、<a href="https://www.youtube.com/@programmingwithmosh">Programming with Mosh</a> 和 <a href="https://learn.microsoft.com?wt.mc_id=studentamb_207021">Microsoft Learn</a>。</p>
<p>通过学习 Python，您可以进行更复杂的数据分析，使任务自动化，和分析更多的数据库，使得您成为任何一个重视数据的公司所需要的人才。</p>
<h2 id="">第七步：精通一个数据可视化的工具</h2>
<p>作为一个数据分析师，能用简洁清晰的方式来展现您的发现是至关重要的。您能用数据可视化来达到这点。像 <a href="https://www.freecodecamp.org/news/python-in-powerbi/">PowerBI</a> 和 Tableau 这样的数据可视化工具可以使得别人更容易理解您的发现。我们待会会进一步讨论它们。</p>
<p>您可以看看这个<a href="https://www.freecodecamp.org/news/tableau-for-data-science-and-data-visualization-crash-course/">针对数据科学和数据可视化的 Tableau 教程</a>。</p>
<p>虽然 SQL 能够很好地查询和操作数据，它不能让这些数据获得生机。在这数据可视化工具就派上了用场。这些工具让您能将您的数据转化为一些有见地并且易于理解的形象。它们可以被分享给您的股东们。</p>
<p>您可以通过 freeCodeCamp 的 YouTube 频道来<a href="https://www.freecodecamp.org/news/learn-data-visualization-in-this-free-17-hour-course/">在这个深入且免费的课程中学习数据可视化基础</a>。</p>
<p>PowerBI 是一个对于数据可视化的极佳选择，因为它学习过程简单，并且能和其他微软产品相结合。对于使用 Microsoft Office 的企业而言，这点使 PowerBI 成为了一个理想的工具。Tableau 也是个流行的选择，它有着有凝聚力的用户社群和广泛的功能。</p>
<p>通过学习像 PowerBI 或 Tableau 这样的数据可视化工具，您能够创造些令人信服的可视化：它们能帮助您更好地理解自己的数据，更好地向大家分享自己的发现。有很多网课和教程能够帮到您学习这些工具，比如说官方的<a href="https://learn.microsoft.com/en-us/training/modules/get-started-with-power-bi/">微软 PowerBI 训练</a>和 <a href="https://trailheadacademy.salesforce.com/classes/TVA101-Tableau-Visual-Analytics">Tableau's 自己的教学课程</a>。</p>
<p>通过熟练掌握一个数据可视化的工具，您能够创造可互动且吸引人的可视化。它们能够帮助您更好地理解您的数据和向大家交流您的数据。这也使得您成为任何一个重视数据的公司所需要的人才。</p>
<p>您也可以更深入地了解其他的热门数据可视化工具，比如说 D3.js —— <a href="https://www.freecodecamp.org/news/data-visualization-using-d3-course/">这是个能帮助您学习它的课程</a>。</p>
<h2 id="">第八步：和其他数据分析师和开发者建立联系</h2>
<p>对于任何职业而言，建立人际网都是特别重要的，对于数据分析也不例外。通过和别的数据分析师和开发者建立联系，您能够从他们的经历中学习，得到关于最新行业趋势和技术的洞见，并且可能找到工作机会。</p>
<p>以下是和该领域从业者建立联系的几种方法：</p>
<ol>
<li>参加行业活动：寻找会议、见面会和其他和数据分析相关的项目，然后参加它们。这个方法能很好地帮助您遇见该行业其他的从业者并了解更多最新发展和科技。<br>
2.加入网上的社群：有很多关于数据分析师和开发者的网络社群，比如说讨论平台、LinkedIn 小组，和社交媒体小组。可以加入这些社群并参与讨论，从而和该领域的其他人产生联系。<br>
3.与别人沟通：不要害怕和别的数据分析师和开发者沟通，不管是通过社交媒体，邮件，还是线下见面。向他们介绍自己，询问一些建议，然后建立关系。</li>
</ol>
<p>记住，建立人际网是双向的。我们也要愿意帮忙和向别人提供建议。通过在数据分析领域里建立一个好的联系网络，您可以增加您的职场机会，并且了解当下的产业趋势和技术。</p>
<h2 id="">第九步：不要忘了软技能</h2>
<p>在成为一个出色的数据分析师之前，我能想到的最后一个需要练习的技能是您的软技能。它包括您的交流和解决问题等能力。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/03/Analyst.jpeg" alt="分析师" width="600" height="400" loading="lazy"></p>
<p>当所有这些完成之后，练习再练习，然后建立项目。</p>
<h2 id="">结论</h2>
<p>成为一个数据分析师，我们需要投入、努力、和对数据分析的热爱。通过在这份指南里列出的步骤，我们可以得到成为一个成功的数据分析师所需的技能和知识。</p>
<p>从理解数据分析师的工作，到熟练掌握SQL和Python，再到和其他的开发者建立联系，其中每一步对于在数据分析领域取得成功而言都至关重要。</p>
<p>要记得保持好奇心、从不停止学习，也要记得一直愿意去接受新的科技和方法。带着决心和坚持，您能成为一个熟练的数据分析师，并解锁更多令人激动的职业机会。</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 什么是数据分析？ ]]>
                </title>
                <description>
                    <![CDATA[ 原文：What is Data Analysis [https://www.freecodecamp.org/news/what-is-data-analysis/]，作者：Dionysia Lemonaki [https://www.freecodecamp.org/news/author/dionysia/] 如今，数据无处不在。随着时间流逝，我们产生的数据总量也与日俱增。 目前虽有大量的可用数据，但是我们应该怎么处理这些数据？如何使用它们？这些数据又意味着什么？ 如果我们只是在电子表格或数据库中收集和存储数据，而不去观察它、探索它、研究它，那么数据就没有意义。 数据分析师使用工具和流程去挖掘数据的意义。他们负责数据的收集、处理、调查、分析，得到洞察并获取新知。 这也是对数据分析师存在大量需求的原因之一：他们在商业和科学中发挥着不可或缺的作用。 在这篇文章中，我会首先介绍数据分析作为一个术语的含义，并解释它为什么如此重要。 我也会拆解数据分析的过程，并列出进行数据分析所需的一些必要技能。 以下是我们将涉及内容的概览：  1. 什么是数据？  2. 什么是数据分析？ ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/what-is-data-analysis/</link>
                <guid isPermaLink="false">62c549318ada24082688b549</guid>
                
                    <category>
                        <![CDATA[ 数据分析 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ JasonLi ]]>
                </dc:creator>
                <pubDate>Wed, 06 Jul 2022 02:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/07/luke-chesser-JKUTrJ4vK00-unsplash-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>原文：<a href="https://www.freecodecamp.org/news/what-is-data-analysis/">What is Data Analysis</a>，作者：<a href="https://www.freecodecamp.org/news/author/dionysia/">Dionysia Lemonaki</a></p><!--kg-card-begin: markdown--><p>如今，数据无处不在。随着时间流逝，我们产生的数据总量也与日俱增。</p>
<p>目前虽有大量的可用数据，但是我们应该怎么处理这些数据？如何使用它们？这些数据又意味着什么？</p>
<p>如果我们只是在电子表格或数据库中收集和存储数据，而不去观察它、探索它、研究它，那么数据就没有意义。</p>
<p>数据分析师使用工具和流程去挖掘数据的意义。他们负责数据的收集、处理、调查、分析，得到洞察并获取新知。</p>
<p>这也是对数据分析师存在大量需求的原因之一：他们在商业和科学中发挥着不可或缺的作用。</p>
<p>在这篇文章中，我会首先介绍数据分析作为一个术语的含义，并解释它为什么如此重要。</p>
<p>我也会拆解数据分析的过程，并列出进行数据分析所需的一些必要技能。</p>
<p>以下是我们将涉及内容的概览：</p>
<ol>
<li><a href="#data-intro">什么是数据？</a></li>
<li><a href="#data-analysis-intro">什么是数据分析？</a></li>
<li><a href="#importance">数据分析为何重要？</a>
<ol>
<li><a href="#targeting">精准定位客户</a></li>
<li><a href="#performance">衡量成功和表现</a></li>
<li><a href="#problem-solving">解决问题</a></li>
</ol>
</li>
<li><a href="#overview">数据分析流程概览</a>
<ol>
<li><a href="#step-1">步骤一：识别并明确需要解答的问题</a></li>
<li><a href="#step-2">步骤二：收集原始数据</a></li>
<li><a href="#step-3">步骤三：清洗数据</a></li>
<li><a href="#step-4">步骤四：分析数据</a></li>
<li><a href="#step-5">步骤五：分享结果</a></li>
</ol>
</li>
<li><a href="#skills">数据分析需要什么技能?</a>
<ol>
<li><a href="#maths">熟练掌握数学和统计学知识</a></li>
<li><a href="#sql">了解 SQL 和关系型数据库</a></li>
<li><a href="#programming-language">掌握一门编程语言</a></li>
<li><a href="#data-viz">熟悉数据可视化工具</a></li>
<li><a href="#excel">了解 Excel</a></li>
</ol>
</li>
</ol>
<h1 id="data-intro">什么是数据？数据的含义和定义</h1>
<p>数据是指事实和碎片信息的集合。</p>
<p>数据对决策、计划甚至讲故事都至关重要。</p>
<p>有两种广泛而普遍的数据类型：</p>
<ul>
<li>定性数据</li>
<li>定量数据</li>
</ul>
<p><strong>定性数据</strong> 是指用非数字字符表示的数据。</p>
<p>它表现为图片、视频、文稿或音频。</p>
<p>这一类型的数据不能被测量或计数。</p>
<p>它用于确定人们对于某事的感受——它关于人们的感受、动机、观点、看法，并包含偏见。</p>
<p>它是描述性的，旨在回答诸如“为什么”、“如何”和“是什么”等问题。</p>
<p>定性数据通过观察、调查和对受访者的访问收集。</p>
<p><strong>定性数据</strong>用数字字符表示。</p>
<p>这一类型的数据可计数、可测量、可比较。</p>
<p>它关于数字的数量，涉及诸如总量和平均数。</p>
<p>它旨在回答诸如“多少”、“多频繁”、“多久”的问题。</p>
<p>收集、分析、解释定量数据的行为，被称为统计分析。</p>
<p>统计分析有助于发掘数据中的潜在模式和趋势。</p>
<h1 id="data-analysis-intro">什么是数据分析？给初学者的定义</h1><h1>
<p>数据分析是通过对数据的清理、转换、操纵和检查，以将原始、混乱的数据转化为有用认知的行为。</p>
<p>从数据中获得的认知，会以图表、图形或仪表盘的形式，直观地展现出来。</p>
<p>被提取出的认知可以帮助企业或组织成长。决策者将能够得出可行的结论，并做出正确的商业决策。</p>
<p>从原始数据中获取知识，将帮助企业或组织推行触达更广泛客户群体的举措，在提升业绩的同时，增加利润。</p>
<p>数据分析的核心是识别和预测趋势，从现有数据中找出模式、相关性和联系，并为复杂问题找到解决方案。</p>
</h1><h1 id="importance">数据分析为何重要？</h1>
<p>数据即知识。</p>
<p>这意味着，数据对各行各业都不可或缺。</p>
<p>即使对行业内的每个部门来说，数据也是大有裨益的，不论是行政部、财务部、后勤部、营销部、设计部或工程部，不一而足。</p>
<p>下面，我将解释为何探寻数据、并为数据赋予背景和意义至关重要。</p>
<h2 id="targeting">数据分析提升目标客户定位</h2>
<p>通过分析数据，了解你的竞争对手，你将使自己的产品或服务与当前市场需求相匹配。</p>
<p>数据分析还能帮你确定产品或服务的最佳受众群体。</p>
<p>这样，你将能通过精准的定价策略，确保你的产品或服务实现盈利。</p>
<p>你也能开展更具针对性的活动，并了解将广告和内容直接有效触达受众的方法和形式。</p>
<p>了解你产品或服务的真正受众将改变你的整个战略，它将变得更以客户为导向，并根据客户需求定制。</p>
<p>本质上讲，有了适当的信息和工具，你将明白怎样交付既有价值，又有质量的产品或服务。</p>
<p>你也确保自己的产品或服务能为客户解决一个痛点。</p>
<p>这在产品开发阶段尤其重要，因为它既减少开支，又节省时间。</p>
<h2 id="performance">数据分析衡量成功和表现</h2>
<p>通过分析数据，你可以衡量自身产品或服务与市场其他竞品的相对表现。</p>
<p>你既能识别出自身具有成功且理想结果的优势领域，也能确定存在问题的弱势领域。</p>
<p>此外，你还可以预估问题可能发生的领域并防患于未然。通过采取行动，防止问题的发生。</p>
<p>通过分析数据，你会明白在未来应该在何事上深度聚焦，在何事上抓大放小。</p>
<p>通过创建表现图，你可以设定目标并确定潜在机会。</p>
<h2 id="problem-solving">数据分析可以帮助解决问题</h2>
<p>通过对关联、正确且准确的数据进行分析，你将对需要做出的正确选择及如何做出更明智的决定都有更好的理解。</p>
<p>数据分析意味着拥有更好的洞察力，这有助于改善决策，并导向问题的解决。</p>
<p>以上这些都会帮助业务成长。</p>
<p>缺少数据分析或数据不足，可能是你的业务停滞的原因之一。</p>
<p>如果是这种情况，数据分析将有助于你在未来提出更有效的战略。</p>
<p>如果你的业务正在成长，数据分析将让它如虎添翼。</p>
<p>数据分析将助力业务潜力发挥，满足不同的目标：如提升客户留存率、开发新客户或提供更顺畅、愉悦的客户体验。</p>
<h1 id="overview">数据分析流程概览</h1>
<h2 id="step-1">步骤一：识别并明确需要解答的问题</h2>
<p>确立一个明确目标是数据分析过程的第一步。</p>
<p>在着手收集大量的数据之前，首先要想清楚为什么要进行数据分析。</p>
<p>你希望解决什么问题？</p>
<p>此次数据分析的目的是什么？</p>
<p>你想做什么尝试？</p>
<p>你想要达成什么？</p>
<p>最终目标是什么？</p>
<p>你想从数据分析中获得什么？</p>
<p>你真的需要数据分析吗？</p>
<p>在这个阶段，对自身商业目标的洞察和理解是至关重要的。</p>
<p>首先，明确你需要答案的正确问题，以及近期和长期的业务目标。</p>
<p>接着，确定数据分析需要什么、需要什么样的数据、需要跟踪和测量什么数据，并思考你想解决的具体问题。</p>
<h2 id="step-2">步骤二：收集原始数据</h2>
<p>下一步要确定收集数据的类型--它是定性的（非数字、描述性的）还是定量的（数字的）。</p>
<p>收集数据的方式和来源，取决于数据是定性的还是定量的。</p>
<p>下面是一些收集相关且适当数据的方法：</p>
<ul>
<li>查阅此前在用户分类、调查、表单、问卷、内部文档和业内访谈中的已有结果。</li>
<li>查看客户评论和满意度反馈。</li>
<li>查看交易和历史购买记录，以及由企业财务部或营销部编制的相关报告。</li>
<li>使用公司的客户关系管理系统（CRM）。</li>
<li>监测网站、社交媒体上的活动以及每月访客。</li>
<li>监测社交媒体的用户参与度。</li>
<li>追踪常见的搜索关键词和搜索语句。</li>
<li>检查常被点击的广告。</li>
<li>检查客户转换率。</li>
<li>检查电子邮件打开率。</li>
<li>使用第三方的服务，比较公司与竞争对手的数据。</li>
<li>查阅数据库。</li>
<li>利用网络爬虫，通过爬取开放数据集来获取收据。<a href="https://www.freecodecamp.org/news/how-to-scrape-websites-with-python-2/">网络爬虫</a> 是指从网站上提取数据和收集内容的行为。</li>
</ul>
<h2 id="step-3">步骤三：清洗数据</h2>
<p>一旦你从多个渠道完成了数据收集的工作，了解其中数据的结构是很重要的。</p>
<p>同样重要的是，检查你是否已经已经收集了全部所需数据，以及其中是否有任何关键数据被遗漏。</p>
<p>如果你通过多个来源收集数据，你的数据很可能是非结构化的。</p>
<p>原始的、非结构化的数据无法使用。不是所有的数据都必然是好数据。</p>
<p>清洗数据是数据分析过程中最重要的部分，也是数据分析师投入大部分时间的部分。</p>
<p>数据需要被清理，这意味着对数据进行纠错、打磨和分类。</p>
<p>这可能包括：</p>
<ul>
<li>寻找<a href="https://www.freecodecamp.org/news/what-is-an-outlier-definition-and-how-to-find-outliers-in-statistics/">离群值</a>（异常大或异常小的数值）。</li>
<li>修正错别字。</li>
<li>删除错误。</li>
<li>删除重复数据。</li>
<li>处理格式的不一致。</li>
<li>检查空值或纠正失真的数据。</li>
<li>检查矛盾之处。</li>
<li>舍弃无关数据和在分析中不需要的数据。</li>
</ul>
<p>这一步将确保你聚焦于分析正确、适当和高质量的数据。</p>
<p>如果你对无关或错误的数据进行分析，它不仅会影响你的单次分析结果，甚至对整体分析都会产生负面影响。</p>
<p>所以，你最终分析的准确性将取决于这一步。</p>
<h2 id="step-4">步骤四：分析数据</h2>
<p>下一步，是基于在步骤一中确定的问题和目标，对数据展开分析。</p>
<p>根据企业的目标及目的，共有四种不同的数据分析技术：</p>
<ul>
<li><strong>描述性分析</strong>：这一步是分析过程中的起始和基础步骤。它通过总结收集到的数据，以回答“发生了<strong>什么</strong>？”。它回顾数据中的关键点，并强调已经发生的事情。</li>
<li><strong>诊断性分析</strong>：这一步利用收集到的数据，试图了解当前问题背后的原因，并识别模式。它的目的是回答“这为什么会发生？”。</li>
<li><strong>预测性分析</strong>：这一步着眼于察觉和预测未来的趋势，对企业未来的发展尤其重要。它旨在回答"未来<strong>可能会发生什么</strong>？</li>
<li><strong>规范性分析</strong>：这一步需要收集前三个步骤中的所有见解，为未来提出建议，并创建一个可行的计划。它的目的是回答“<strong>需要做什么？</strong>”</li>
</ul>
<h2 id="step-5">步骤五：分享结果</h2>
<p>最后一步是阐释你的发现。</p>
<p>通常会使用数据可视化工具来创建报告、图表、图形或交互式仪表盘。</p>
<p>当你向利益相关者、业务主管和决策者介绍发现和分析结果时，上述这些都会起到帮助作用。</p>
<p>数据分析师是讲故事的人，这意味着拥有强大的沟通技巧很重要。</p>
<p>他们需要数据和叙事，从而以清晰、简洁、直截了当的方式来展示结果。</p>
<p>这一步将影响企业的决策和未来选择。</p>
<h1 id="skills">数据分析需要什么技能？</h1>
<h2 id="maths">熟练掌握数学和统计学知识</h2>
<p>作为一名数据分析师，你使用的数学知识量将根据工作的不同而不同。有些工作可能比其他工作更需要使用数学。</p>
<p>你不一定非要成为一个数学奇才，但对数学基础知识的基本了解，将对你有很大帮助。</p>
<p>这里有一些数学课程可以让你起步：</p>
<ul>
<li><a href="https://www.freecodecamp.org/news/learn-algebra-to-improve-your-programming-skills/">大学代数——免费大学数学前置课程（7小时）</a></li>
<li><a href="https://www.freecodecamp.org/news/precalculus-learn-college-math-prerequisites-with-this-free-5-hour-course/">微积分先修课——免费大学数学前置课程（7小时）</a></li>
<li><a href="https://www.freecodecamp.org/news/maths-for-programmers/">程序员的数学课</a></li>
</ul>
<p>数据分析师需要掌握统计学和概率知识，以收集和分析数据，找出其中的模式，并从数据中得出结论。</p>
<p>要想开始学习，可以先从统计学入门课程入手，然后继续学习进阶课题：</p>
<ul>
<li><a href="https://www.freecodecamp.org/news/free-statistics-course/">学习大学统计学（8小时免费课程）</a></li>
<li><a href="https://www.freecodecamp.org/news/if-you-want-to-learn-data-science-take-a-few-of-these-statistics-classes-9bbabab098b9#.esdiw8wnk">如果想学习数据科学，请上这几堂统计课</a></li>
</ul>
<h2 id="sql">了解 SQL 和关系型数据库</h2>
<p>数据分析师需要了解如何运用数据库以提取数据。</p>
<p>数据库是储存数据的电子空间，其中的数据可以很容易地被检索和查询。</p>
<p>关系型数据库是结构化的，所有存储的数据项目都有预先定义的相互关系。</p>
<p>SQL 是 <strong>S</strong>tructured <strong>Q</strong>uery <strong>L</strong>anguage （结构化查询语言）的缩写，是用于查询和与关系型数据库互动的语言。</p>
<p>通过编写 SQL 查询语句，你可以对数据进行 CRUD （Create（创建）、Read（读取）、Update（更新）和 Delete（删除））操作。</p>
<p>要想学习 SQL ，可以参考以下资源：</p>
<ul>
<li><a href="https://www.freecodecamp.org/news/learn-sql-in-10-minutes/">SQL 命令小抄——如何在10分钟内学会 SQL</a></li>
<li><a href="https://www.freecodecamp.org/news/learn-sql-free-relational-database-courses-for-beginners/">学习 SQL ——初学者的免费关系数据库课程</a></li>
<li><a href="https://chinese.freecodecamp.org/learn/relational-database">关系型数据库认证</a></li>
</ul>
<h2 id="programming-language">掌握一门编程语言</h2>
<p>掌握一门编程语言，会让数据分析师在进一步组织和操作数据库中受益良多。</p>
<p>在数据分析领域，最受欢迎的两种语言是 Python 和 R 。</p>
<p>Python 是一种通用的编程语言，因其语法类似英语，所以对初学者非常友好。它也是数据分析中最常用的技术工具之一。</p>
<p>Python 提供了丰富的用于数据处理的包和库，如 Pandas 和 NumPy ，以及用于数据可视化的 Matplotlib 。</p>
<p>要想开始学习，可以先看下<a href="https://www.freecodecamp.org/news/how-to-learn-python/">零基础如何学习 Python </a>。</p>
<p>一旦你理解了基础知识，你就可以继续学习 Pandas 、 NumPy 和 Matplotlib 。</p>
<p>这里是一些可供学习的资源：</p>
<ul>
<li><a href="https://www.freecodecamp.org/news/python-pandas-functions/">如何在 Python 中使用 Pandas ——初学者指南</a></li>
<li><a href="https://www.freecodecamp.org/news/the-ultimate-guide-to-the-pandas-library-for-data-science-in-python/">Python 中用于数据科学的 Pandas 终极指南</a></li>
<li><a href="https://www.freecodecamp.org/news/the-ultimate-guide-to-the-numpy-scientific-computing-library-for-python/">Python 中用于科学计算的 NumPy 终极指南</a></li>
<li><a href="https://www.freecodecamp.org/news/numpy-python-tutorial/">学习 NumPy 并开始用 Python 进行科学计算</a></li>
<li><a href="https://www.freecodecamp.org/news/how-to-analyze-data-with-python-pandas/">如何用 Python、Pandas 和 Numpy 分析数据——10 小时课程</a></li>
<li><a href="https://www.freecodecamp.org/news/matplotlib-course-learn-python-data-visualization/">Matplotlib 课程——学习 Python 数据可视化</a></li>
<li><a href="https://www.freecodecamp.org/news/python-data-science-course-matplotlib-pandas-numpy/">Python 数据科学--面向初学者的 12 小时免费课程，学习 Pandas、NumPy、Matplotlib 及更多</a></li>
</ul>
<p>R 是一种用于统计分析和数据分析的语言。换言之，它不像 Python 那样适合初学者。</p>
<p>要开始学习 R 语言，可以从以下课程入手：</p>
<ul>
<li><a href="https://www.freecodecamp.org/news/r-programming-language-explained/">R 语言解读</a></li>
<li><a href="https://www.freecodecamp.org/news/r-programming-course/">2 小时掌握 R 语言基础（免费统计编程课程）</a></li>
</ul>
<h2 id="data-viz">熟悉数据可视化工具</h2>
<p>数据可视化是对数据的图形化解释和展示。</p>
<p>这包括创建图形、图表、交互式仪表板或地图，以便于与其他团队成员及重要的利益相关者分享。</p>
<p>数据可视化工具本质上是用于依托数据讲故事并推动决策。</p>
<p>Tableau 是最受欢迎的数据可视化工具之一。</p>
<p>要学习 Tableau ，请查看以下课程：</p>
<ul>
<li><a href="https://www.freecodecamp.org/news/tableau-for-data-science-and-data-visualization-crash-course/">用于数据科学和数据可视化的 Tableau ——速成课</a></li>
</ul>
<h2 id="excel">了解 Excel</h2>
<p>Excel 是数据分析中最必不可少的工具之一。</p>
<p>它用于存储、结构化和格式化数据，运行计算、总结数据和识别趋势，将数据进行分类，并创建报告。</p>
<p>你也可以使用 Excel 来创建图表和图形。</p>
<p>要学习如何使用 Excel ，请查看以下课程：</p>
<ul>
<li><a href="https://www.freecodecamp.org/news/learn-microsoft-excel/">学习 Excel ——完整视频课程</a></li>
<li><a href="https://www.freecodecamp.org/news/excel-classes-online-free-excel-training-courses/">Excel 在线课程——11 门免费 Excel 培训课程</a></li>
<li><a href="https://www.freecodecamp.org/news/data-analysis-with-python-for-excel-users-course/">针对 Excel 用户的 Python 数据分析课程</a></li>
</ul>
<h2 id="">总结</h2>
<p>这是文章的最后一部分了——非常感谢你能阅读到最后。</p>
<p>希望这篇指南对你有所帮助，能让你了解什么是数据分析、数据分析为何重要，以及进入这个领域需要何种技能。</p>
<p>感谢你阅读本文！</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 数据分析中的核心概念概述 ]]>
                </title>
                <description>
                    <![CDATA[ 数据分析包含了数据检查、清洗、变换和建模等流程，借助数据分析，我们可以从数据中获取有用的信息。 在现代生活中，数据分析无处不在：它有助于技术的改进，软件的构建以及产品的发展。 本文首先会介绍数据分析的核心原则及其应用，接着会提供一些示例，借助这些示例所展示的方法，你也可以在自己的数据集上获得有价值的信息。 同时，我也会分享几个大家所熟悉的，诸如网页优化、健康和饮食软件，农业和保险等产品中的数据分析应用。 如果你也认同“数据是影响你决定的向导“，那么就往下继续学习吧。 例题 首先，看看你是否可以回答以下这些问题。 即使现在不能轻易地回答出这些问题，也没有关系。 相信通过本文的学习，你一定可以轻松地给出答案。 一家只售卖一件商品的互联网零售业务经理发现，大约有 26% 的网页访问者会购买商品。他同时也发现这些消费者的行为是独立的。 现在假设有 8 位潜在的消费者每天都会访问网站。这位经理参加了一个激励计划：如果一天之内有超过三位（包含三位）消费者在该网站上进行了消费，那么经理将得到 $300 的日薪，否则他只能得到 $100 的日薪。 a. 这位经理得到 $300 日薪 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/a-30-000-foot-introduction-to-data-analytics-and-its-foundational-components/</link>
                <guid isPermaLink="false">6038ba80c354c605689ea8f4</guid>
                
                    <category>
                        <![CDATA[ 数据分析 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jingrou Wu ]]>
                </dc:creator>
                <pubDate>Fri, 26 Mar 2021 10:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/02/photo-1423189871551-9b8513198c81.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>数据分析包含了数据检查、清洗、变换和建模等流程，借助数据分析，我们可以从数据中获取有用的信息。</p>
<p>在现代生活中，数据分析无处不在：它有助于技术的改进，软件的构建以及产品的发展。</p>
<p>本文首先会介绍数据分析的核心原则及其应用，接着会提供一些示例，借助这些示例所展示的方法，你也可以在自己的数据集上获得有价值的信息。</p>
<p>同时，我也会分享几个大家所熟悉的，诸如网页优化、健康和饮食软件，农业和保险等产品中的数据分析应用。</p>
<p>如果你也认同“数据是影响你决定的向导“，那么就往下继续学习吧。</p>
<h2 id="">例题</h2>
<p>首先，看看你是否可以回答以下这些问题。</p>
<p>即使现在不能轻易地回答出这些问题，也没有关系。</p>
<p>相信通过本文的学习，你一定可以轻松地给出答案。</p>
<p>一家只售卖一件商品的互联网零售业务经理发现，大约有 26% 的网页访问者会购买商品。他同时也发现这些消费者的行为是独立的。</p>
<p>现在假设有 8 位潜在的消费者每天都会访问网站。这位经理参加了一个激励计划：如果一天之内有超过三位（包含三位）消费者在该网站上进行了消费，那么经理将得到 $300 的日薪，否则他只能得到 $100 的日薪。</p>
<p>a. 这位经理得到 $300 日薪的概率是多少呢？</p>
<p>答案：~35%</p>
<p>b. 这位经理的期望日薪是多少呢？</p>
<p>答案：$170</p>
<p>c. 现在，这位经理一共有三个可选择的激励计划：(a) 没有基础工资，但是每卖出一件商品，就可以获得 $75 的奖励；(b) 每天固定工资 $165；(c) 保持原激励计划不变</p>
<p>如果这位经理想要最大化自己的期望收益，他该选择哪一个激励计划呢？</p>
<p>答案：原来的激励计划</p>
<h2 id="">数据分析的基本概念</h2>
<p>我们需要先对数据本身有一定的了解，才能在此基础继续学习，从而解决上述问题。</p>
<p>关于数据分析首先要知道的是，数据有不同的类型。这个概念就和听上去的一样简单易懂。</p>
<p>按照不同的数据分类规则，数据可以被分为不同类型。</p>
<p>数据可以是分类数据（性别、地点等）；也可以是数值型数据（客户数量、活跃用户数等）。</p>
<p>数据可以是离散的，比如说一份工作的应聘人数就是离散的；也可以是连续的，比如说一些无限可能的结果。</p>
<p>在开始数据分析前，了解你的数据类型是非常有必要的。</p>
<p>你所拥有的数据是离散的还是连续？你的数据是分类数据还是数值型数据？</p>
<p>在回答了这些问题之后，你才可以对数据进行进一步的挖掘。</p>
<p>除了上述两种分法外，数据还可以根据其和时间的关系，分为下面三大类：</p>
<ol>
<li>截面数据类型：这种数据描述了某个时间点上，事物的模式或者趋势。像人口普查这种民意调查的结果就是截面数据的一种。</li>
<li>时间序列数据类型：这种数据与一段时间相关，比如我的测试成绩、一段时间内的<a href="http://www.humaverse.com/">工资</a>、 公司一年的<a href="https://www.couponupto.com/information/couponupto-data-analytics-department-report-for-the-last-6-months-of-2019?fbclid=IwAR3Uq1kfTh4vQ3cjzmR0Rj0LPv9eT4DOuxJ84rE_1nA2XVfeCN5vQBXEJm0">折扣</a>情况等都属于时间序列数据。</li>
<li>面板数据：像公司存在客户关系管理(CRM)系统中的数据就是面板数据的一种。面板数据包含了多个事物在多个时间点上的信息。随着存储设备日趋便宜，这种数据类型也变得更加普遍。</li>
</ol>
<h2 id="">离散程度：数据是如何组织的</h2>
<p>通过观察数据的形状，你可以大致地了解到它们的离散程度。</p>
<p>我们也可以使用集中趋势这一方法对数据进行组织。</p>
<p>首先我们让数据从小到大排序。</p>
<p>当数据有序地排列时，你就可以直观地看到他们的离散程度。</p>
<p>你可以通过最大数据值减去最小数据值的方式得到数据的取值范围，这是衡量数据离散程度一种方式。</p>
<p>如果数据的取值范围很大，我们就可以称这样的数据具有较高的离散程度。</p>
<p>最后，你可以在现有可获得的数据或是数据集中，尝试计算出他们的平均值，中位数和众数。</p>
<p>现在试想一下这个实验：假设你在装满 M&amp;M 巧克力豆的不透明罐子里取出了一颗红色的巧克力豆，你对这罐巧克力豆会有什么样的想法呢？</p>
<p>显然，仅仅一次的实验结果并不能让我们得出什么有用的推断。下面我们就用置信区间这一概念进行解释。</p>
<h2 id="">置信区间</h2>
<p>置信区间就是当前样本数据可能的取值范围，这个可能性的大小我们用置信度来描述。</p>
<p>置信区间以置信上限和置信下限作为区间的上下限，整个数据的均值往往也是这个区间的均值，置信度则用百分数来表示。</p>
<p>回到 M&amp;M 巧克力豆的问题。</p>
<p>假设你做了无数次的实验，每次都从这个罐子里取出了红色的巧克力豆。也就是说，你只能取出红色的巧克力豆。那么此时你对这罐巧克力豆有什么样的猜测呢？</p>
<p>你会觉得_很有可能_这个罐子里只有红色的巧克力豆。这是一个有效的结论。</p>
<p>需要注意的是，我们并不是说“这个罐子里没有其他颜色的巧克力豆”。而是说有很大的可能性，这个罐子里只有一种红色的巧克力豆。</p>
<p>你每取出一颗红色巧克力豆，这个推论的置信度就会相应增加。</p>
<h2 id="vs">抽样 vs 整体测量</h2>
<p>在收集数据的时候，你既可以关注总体所有的数据，也可以关注总体数据的抽样样本。</p>
<p>为了说明世界上的 M&amp;M 巧克力豆只有一种颜色，你是否需要看遍每一颗巧克力豆？还是只需要关注抽样后的巧克力豆？</p>
<p>当总体数据过于庞大时，抽样就有了意义。</p>
<p>抽样总体是总体数据中的一个子集。通过对这个子集的分析我们可以推测出总体数据的某些特性。</p>
<p>抽样可以帮助我们了解在某一个分布中，某一件事发生了多少次或者某一种类型的结果出现了多少次。</p>
<h2 id="">整合：抽样和期望</h2>
<p>观察是数据分析的关键，因为观察可以帮助你回答一些特定的问题：</p>
<ol>
<li>事情发生的可能性有多大？</li>
<li>如果某件事的概率已知，那么当这件事发生的时候，你可以获得多少收益？</li>
</ol>
<p>某件事发生的期望就是这件事情发生的概率乘上总的事件发生次数。</p>
<p>当大多数的收益数据都低于该数据集的中点值，那么你的期望收益就会增加。想象一下创立一家成功的公司的概率。大多数公司不会发起首次公开募股(IPO)，因此它们不能从中得到收益。</p>
<p>那么相应地，那些发起 IPO 的公司就会获得巨大的收益。当我成立一个[帮助人们远程办公]的网站时，我认为成功的概率最多只有 10%。</p>
<p>Jeff Bezos 曾说他认为 Amazon 成功的概率有30%。</p>
<p>我们经常用标准差来描述数据的离散度，标准差就是方差的算术平方根。</p>
<p>方差是每个数据与该数据集的平均值的差的平方的总和。</p>
<h2 id="">例题和答案</h2>
<p>本文已经概括性地介绍了统计和数据分析中的核心概念。</p>
<p>现在利用这些新学到的知识，尝试回答下面两个问题。</p>
<p>如果你能成功解决它们，说明你学习得不错！</p>
<p>网站的设计者和程序员 John Bell 想要知道，创立一家网页设计公司是否可以盈利。</p>
<p>根据客户需求的不同，John 认为他的公司可以提供四种不同的服务：</p>
<ul>
<li>极低需求 - 只有 1% 的公司会使用这种服务，John 因此会损失 $100,000</li>
<li>低需求 - 只有 5% 的公司会使用这种服务，John 因此可以盈利 $10,000</li>
<li>中等需求 - 有 10% 的公司会使用这种服务，John 因此可以盈利 $25,000</li>
<li>高需求 - 有 29% 的公司会使用这种服务，John 因此可以盈利 $75,000</li>
</ul>
<p>根据过往的设计网站的经验，John 认为每种需求的占比如下：</p>
<pre><code class="language-plain">P(极低需求) = 0.20
P(低需求) = 0.50
P(中等需求) = 0.20
P(高需求) = 0.10
</code></pre>
<p>(a) 建立决策树并计算提供服务的期望收益</p>
<pre><code class="language-plain">.2 * (-100,000) + .5 * (10,000) + .2 * (25,000) + .1 * (75,000)
= $ -2,500
</code></pre>
<p>(b) 当 John 知道每种需求的类型时，计算他的期望收益（也就是他可以拒绝极低需求的开发工作）</p>
<pre><code class="language-plain">.5*100,000 + .2*25,000 + .1*75,000 = $17,500
</code></pre>
<p>换言之，John 相信如果开设公司，他将会赚 $17,500。</p>
<p>有了数据分析作为前瞻性指导，John 可以决定是继续开公司还是寻找另一种展现才华的方式。</p>
<h2 id="">关于数据分析的个人想法</h2>
<p>本文只是一篇启发式读物，希望它可以激发你学习和研究数据分析的兴趣。</p>
<p>学习数据分析将帮助你更好地理解软件和开发自己的产品。就像 John 的例子一样，你也可以使用数据分析的方法为你的决策提供更具前瞻性的指导。</p>
<p>在了解成功与失败的赔率时，你可以选择冒险一试。你也可以运用计数原理来做出不同决策。</p>
<p>数据分析也会帮助你理解科技是如何改变线下环境，因此促使你成为一名更有想法的消费者。</p>
<p>数据分析的应用范围十分广阔。不知道看到这里的你是否也对它在科学、技术、商业、软件或者产品设计等方面的应用感兴趣呢？</p>
<p>现在我将正式说明数据分析在这些领域中的深远影响。</p>
<p>首先考虑我们的身体。</p>
<p><a href="https://www.gilisports.com/">健康产品</a>，<a href="https://commonthreadco.com/blogs/coachs-corner/health-wellness-marketing-ecommerce">健康营销</a>，健身 app 都使用了来自用户的数据，并通过分析这些数据来优化自身产品（比如说心率数据、血氧数据、睡眠模式等）。</p>
<p>这些产品通过数据分析评估用户实时状态、生理特征识别和情绪分析。</p>
<p>再来看看软件。</p>
<p><a href="https://www.frevvo.com/low-code-development-platforms">低代码量开发</a> 工具也使用了数据分析的方法为开发者们提供了各式各样可能的用户体验。在这个项目中，数据模块是提前定义好的。</p>
<p>和软件很像，教育行业也正在通过数据分析进行转型。学校的在线学习模式和<a href="https://alldigitalschool.com/top-10-best-coding-apps-for-your-kids/">儿童编程 app</a>依赖于数据分析进行风险管理（当学生的进度落后时）和复习。</p>
<p>接着再考虑保险险别是如何定价的。</p>
<p>当保险公司需要对不同保险政策定价时，抽样就发挥了作用。越来越多的金融机构和保险公司运用数据分析来评估用户的声誉，以此来定价和销售保险合同，以及自动化与客户的互动。</p>
<p>网页设计也值得一提。</p>
<p>无论你是否主动想要将数据分析运用到搭建下个<a href="https://getvoip.com/call-tracking-software/">电话追踪软件</a>还是<a href="https://www.factinate.com/">真相收集网页</a>，数据分析都会帮助你衡量事物重要性并且将数据转化为有价值的信息。</p>
<p>数据分析在农业领域也很重要。</p>
<p>高科技种植业比如 <a href="https://joyorganics.com/cbd-manufacturers/">JoyOrganics</a>和<a href="https://takespruce.com/">TakeSpruce</a>都在使用数据分析对农产品进行了完整的追踪，从种子萌芽成长开始一直到收获销售。</p>
<p>农民们使用数据分析嗅到高回报的信号，并且优化他们的种植过程。</p>
<p>再想想<a href="https://wfhadviser.com/guides/health-and-well-being/keeping-your-indoor-air-quality-clean/">室内环境检测</a>和<a href="https://brooksmanley.com/entity-seo/">自然语言处理</a>。</p>
<p>还有<a href="https://nethunt.com/">CRM 软件</a>的搭建和人们在日常生活中的<a href="https://coastapp.com/">实时交流</a>。</p>
<p>简而言之，多想想我们身处的现代社会。</p>
<p>所有这些产品都使用了数据分析，包括但不限于计算抽样误差、标准差、回归等手段，保证了产品质量和用户满意度。</p>
<p>当然，在开始使用这些复杂的统计学工具前，大家都是从最基础的要素入手的，包括频率、离散度、平均值和标准差。</p>
<p>有了这些手段，数据分析就可以把数据转换为我们所需要的有用信息。</p>
<p>更重要的是，所有这些工业产品都使用了数据分析来做取舍，也用数据分析更深层次地理解他们的用户是如何使用自己的产品。</p>
<p>在这些领域的深度探索，无疑会使你成为一位更加全面和坚持不懈的开发者。</p>
<p>姑且不论上述提到的种种好处，学习数据分析本身也是一件十分有价值的事情。</p>
<!--kg-card-end: markdown--><p>原文：<a href="https://www.freecodecamp.org/news/a-30-000-foot-introduction-to-data-analytics-and-its-foundational-components/">What is Data Analytics? A 30,000-Foot Intro to Key Data Analysis Concepts</a>，作者：<a href="https://www.freecodecamp.org/news/author/adam-naor/">Adam Naor</a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
