增強分析可讀性 - Pandas 教程


作者 | Pathairush Seeda
編譯 | VK
來源 | Towards Data Science

你的日常生活數據分析

作爲一名數據科學家 / 分析師,你的工作是製作一份包含許多商業決策見解的報告。報表可以由幾個有用的工具(如 microsoftexcel、SAP)生成,也可以使用編程語言(如 SAS、R 或 Python)進行定製。結果可以通過內部電子郵件發送給其他人,也可以通過儀表板發佈。

和其他人一樣,我也是一名數據分析師,在日常生活中使用 python 製作報告或演示文稿。我通常的任務是在 2-3 小時內進行分析,並提交給管理團隊。

爲了得到我想要的結果,我必須啓動我的 Jupiter 筆記本內核並快速編寫代碼來生成數字。在那之後,我可以把結果放在微軟的 PowerPoint 上,並在一天結束前附上一些基本的腳註,然後把它們發給我的主管,讓他們演示並做出重要的決定。

一個痛點是,由於時間限制,我必須消化信息,編寫代碼生成結果,並將其以一種漂亮的格式放入 Microsoft PowerPoint 中呈現。

不幸的是,我使用的編程語言可能不適合管理團隊的閱讀,例如,在數字中添加逗號或不使用科學符號來顯示大數字。

如果你提交報告時沒有注意到這些方面,管理團隊可能會對你的報告有很多抱怨,有時,他們會把報告扔到垃圾堆裏,一眼也不看。那會讓你非常惱火,因爲你需要時間和精力。

要解決這個問題,你可以將編程語言的結果放入 microsoftexcel,然後根據需要手動更改格式。Excel 是一個很好的工具。不好的地方是你必須手工做。如果我們能在編程過程中實現自動化呢。那太好了,不是嗎?

As-is

下面讓我們看一下我爲這個示例生成的數據幀。這是公司需要的收入額。如你所見,這是 pandas 數據幀返回的默認結果。沒有任何配置。

我經常從我的主管或首席執行官那裏得到的一個評論是。

你能讓它更易讀,更容易比較嗎?”

解決辦法可能是把這個數字除以一百萬,然後把單位放在表的上方。你要記住的一點是,在你的演講中應該保持一致。如果有 100 張表需要複製呢?很難,對吧。

我發現你可以用編程的方式解決它。我花了很多時間從網上收集以下代碼片段。非常感謝 Stack overflow!

我認爲和你們分享這些會讓任何像我一樣發現這些問題的人受益。你會減少花在這上面的時間,然後把注意力放在內容的有效性上。

如何改進?

可讀格式

我收到的最常見的評論是,你能把數字四捨五入,並使用符號,如 M 表示百萬或 K 表示千?這將使你的表看起來更好,並減少不必要的信息。很多時候,我們不需要這麼精確。

下面是一個函數,用於將數據框中的數字轉換爲所需的格式。

def human_readable_format(value, pos=None):

    '''
    將數據幀中的數字轉換爲可讀格式
    `pos` 參數與matplotlib ticker格式化程序一起使用。
    '''

    assign_unit = 0
    units = ['''K''M''B']
    while value >= 1_000:
        value /= 1_000
        assign_unit += 1

    return f"{value:.2f} {units[assign_unit]}"

這是你將得到的結果。讀起來容易多了,對吧?

此函數的缺點是將數字轉換爲字符串,這意味着你將失去數據幀的排序能力。這個問題可以通過先排序所需的值,然後再應用它們來解決。

你可以將結果保存到 excel 或 CSV 文件,並將其放入 PowerPoint 中。我的方法通常是截圖,然後直接放到演示文稿中。

這個代碼片段節省了我大量的時間來重新生成多個表,因爲當你從你的主管那裏得到註釋時,你必須刷新所有的表。假設演示文稿中有 100 個表。對於那些一個一個手工修改的人來說,這是一場噩夢。

同樣,格式化後,我們也可以在 matplotlib 圖中使用它。如果你使用 pandas 庫進行數據分析,我認爲 matplotlib 將是你繪製圖形的首選。

你可以使用與表格類似的可讀格式設置此圖形的 y 軸

import matplotlib.ticker as mticker
import matplotlib.pyplot as plt

fig , ax = plt.subplots();
df['value_9'].plot(ax=ax);
ax.yaxis.set_major_formatter(
    mticker.FuncFormatter(human_readable_format)
)

看起來更有說服力。

突出顯示單元格

有時你需要指出表中的重要數字、趨勢或信息。你腦子裏有一個邏輯規則,比如用收款金額的最大值突出顯示月份。數字可以根據數據中的底層事務而變化。如果你想動態地突出顯示它,就必須以編程的方式進行。

這是我用來使我的表格看起來更好的第二件事。它能幫助你傳達信息,提高你講故事的能力。從其餘部分中強調什麼是重要的。

def highlight_max_value(series):

    # 獲取序列中每個值的真或假狀態
    boolean_mask = series == series.max()

    # 當布爾掩碼爲真時,返回顏色爲橙色
    res = [f"color : orange" if max_val else '' for max_val in boolean_mask]

    return res

df.style.apply(highlight_max_value)

有時,你會更容易發現數據內部的潛在趨勢。如果不對大量數據進行適當的重新排列,你是不可能從這些數據中發現這些模式的

少就是多

最後一個不是向數據框 / 圖中添加一些有趣的內容,而是將其刪除。有時少就是多。數據幀或圖形中的組件越少,消息傳遞就越好。讀者或接受者只能吸收他們必須吸收的東西。

你可以在這方面改變很多事情,例如。

# 準備數據集

revenue = df[['value_9']].copy()
revenue['pct'] = revenue['value_9'] * 100 / revenue['value_9'].sum()
revenue = revenue.sort_values('pct'ascending=False).reset_index(drop=True)
revenue['cumsum_pct'] = revenue['pct'].cumsum()

import matplotlib.ticker as mticker
import matplotlib.pyplot as plt
import seaborn as sns

# 繪製條形圖以顯示收入金額

sns.set_context('talk')

# 放大圖形的字體大小

fig , ax = plt.subplots(figsize=(9,6));
revenue['value_9'].plot.bar(ax=ax);
ax.yaxis.set_major_formatter(mticker.FuncFormatter(human_readable_format))
plt.title('Revenue generated');

# 以百分比繪製累計收入
# 展示前三位客戶的影響

ax2 = plt.twinx(ax)
revenue['cumsum_pct'].plot(ax=ax2, color='orange');
ax2.yaxis.set_major_formatter(mticker.PercentFormatter())
sns.despine();

通過排列數據並向其中添加一些信息,可以使用更直觀的圖表進行決策。例如,我們知道只有前三位客戶佔我們收入的 80% 以上。因此,讓他們保持良好的關係比其他任何事情都有必要。

摘要

在一個新的時代,數據分析員使用編程語言來生成報告或表示。它減少了很多手動任務的時間,但是還有更復雜的事情要處理,如上所述。這是一種權衡。

我想我今天和你們分享的技巧和竅門在某種程度上會有所幫助。

本文中的所有代碼都可以在這裏找到:https://colab.research.google.com/drive/1AZQ3kBGmpoherJxOP8yIwUZzyid-1i70?usp=sharing

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/1nwtcMGDY3P5qjqR2kYorw