תרשים עוגה כחלופה הולמת לגרף עמודות

בלוג, הדמיית נתונים

תרשים עוגה כחלופה הולמת לגרף עמודות

במהלך חיי המקצועיים שמעתי רבות בגנות תרשימי עוגה. הסיבה לכך נעוצה בעובדה שקל מאוד לייצר זוועות עם תרשימים אלו. לא עזרה העובדה שבמשך המון זמן ברירת המחדל של תרשימי עוגה, בכל כלי ההדמיה העיקריים, ייצרה תרשימים מעוותים לגמרי. מצדדי החרם על תרשים עוגה מציעים את גרף העמודות כחלופה ראשונה. יחד עם זאת צריך לזכור שלא מתקנים עוול אחד בעוול אחר. לפעמים גרף עוגה דווקא מתאים יותר מגרף העמודות. בואו נראה דוגמה למקרה כזה.

הכנסת המתפקדת האחרונה שהייתה לנו במדינת ישראל הייתה הכנסת ה־20. בואו נראה איך התפלגו מושבי הכנסת בין המפלגות השונות.

זה הקוד ליצירת תרשים עוגה בסיסי בשפת פייתון עם שימוב בספריות סטנדרטיות

fig, ax = plt.subplots()
ax.pie(
    x=tbl_knesset20['מושבים'],
    labels=tbl_knesset20['מפלגה']
)

עד לא מזמן, התוצאה הייתה נראית ככה:


עזבו לרגע את העברית ההפוכה (נטפל בזה בהמשך), הגרף הזה פשוט נורא. הבעיה הגדולה ביותר שלו זה עווית המציאות. כאשר אנחנו מסתכלים על תרשים עוגה, אנחנו אומדים (estimate) שטחים וזוויות. במקרה הזה, יחס גובה/רוחב של העיגול לא נשמר ואתו גם נהרסו השטחים והזוויות. מה עושים?  ספריית matplotlib  מאפשרת קיבוע של יחס גובה/רוחב על ידי ax.set_aspect(1.0) . לשמחתי, גרסאות חדשות של ספריה זו הכניסו את היחס הנכון כברירת מחדל והעוגה הדפולטיבית נראית עגולה היום. ברוך ה׳


לפני שנפתור את הבעיות הגדולות יותר, בואו נטפל בעברית. כל מה שצריך לעשות זה להתקין ספריה מתאימה.

fig, ax = plt.subplots()
ax.set_aspect(1.0)
patches, texts = ax.pie(
    x=tbl_knesset20['מושבים'],
)
ax.legend(patches, tbl_knesset20['label'])
ax.set_title(bidialg.get_display('לא לנסות בבית'))

עדיין לא טוב. מרוב עצים לא רואים את היער. האם הצופה יכול לראות כמה מושבים יש לש״ס, למשל? או לליכוד?

ניסיון להזיז את המקרא ולהוסיף מספרים עדיין לא עובד טוב

בנקודה הזאת, האדם הסביר שלמד הדמית נתונים מרים ידיים, נזכר בתרשימי עמודות ומייצר משהו נחמד

זה יותר טוב, אבל לא מצויין. למה לא? כי אם כל מה שאנחנו רוצים להגיד זה כמה מושבים יש לכל מפלגה, לא צריך גרף, טבלה יכולה להספיק. אבל אם אנחנו רוצים להציג את מאזן הכוחות בכנסת הזאת, הגרף הזה לא מספק את הסחורה בכלל. למעשה, אין לנו כאן עשר מפלגות, אלא שתי קבוצות של מפלגות – הקואליציה והאופוזיציה (זוכרים כמה משעמם היה פעם). ואם מה שמעניין אותנו זה מאזן בין שתי קבוצות, אז גרף עוגה יכול להיות בחירה טובה.

לפני שנמשיך, להלן כללי אצבע לתרשים עוגה טוב אותם ליקטתי בספרות

  • מעט מאוד קבוצות (הייתי אומר, עד 4)
  • הפלחים ממוינים. המיון מקל על ההשוואה
  • עיגול צריך להראות עיגול (יחס גובה/רוחב שווה ל־1(
  • זהו

״רגע!״ אתם וודאי צועקים, לא אמרת מעט קבוצות?  ״כן,״ אני עונה – כאן יש שתי קבוצות: קואליציה ואופוזיציה. בואו נצבע את הפלחים בהתאם

אנחנו מתקרבים. בנקודה זאת אני קצת מרמה. אני רוצה לקבץ את כל מפלגות הקואליציה ביחד, ואת האופוזיציה ביחד. טכנית, כדי לבצע את הקיבוץ הזה, אני הכפלתי את מספר המושבים של הקואליציה במינוס אחד, והתוצאה לפנינו:

נו, תגידו אתם, מה יותר טוב?

אני טוען שבמקרה הזה העוגה עדיפה על המקלות.

מי שמעוניין לראות את קוד הפייתון אתו יצרתי את הגרפים האלה, מומן להגיע לרפוזיטורי שלי בגיטהאב, בו יש עוד הרבה דוגמאות מעניינות..

להלן חוברת העבודה הרלוונטית

https://github.com/bgbg/datascience_dataviz_workshop/blob/master/demos/item_distribution/pie%20charts%20as%20an%20alternative%20to%20bar%20charts%20-%20the%20Israeli%20Knesset.ipynb

הדמיית נתונים כמשימה הנדסית – גישה שיטתית ליצירת הדמיה יעילה

בלוג, הדמיית נתונים

ביוני השנה השתתפתי בכנס NDR בעיר יאשי שברומניה. לפני מספר ימים המארגנים העלו את הקלטות הוידאו של הכנס ליוטיוב. בין ההקלטות גם ההרצאה שלי.

ביוני הבא יתקיים כנס NDR נוסף. הפעם אני נוסע לבוקרסט וגם שם אדבר על הדמיית נתוים.

לפעמים, לא באמת צריך מקרא

בלוג, הדמיית נתונים

פוסט זה נכתב בהשראת השיעור השבועי של בלה גוטיה בה היא נותנת כמה עצות של ״עשה״ ו־״אל תעשה״ בהקשר של מקרא בגרפים. התפלאתי לראות שבלה לא אמרה שלפעמים לא באמת צריך מקרא, לפחות לא במובן הקלאסי של המילה.

בואו נראה דוגמא פשוטה. נעקוב אחרי תל״ג לנפש בישראל, צרפת ואיטליה בשנים 2000 עד 2012. לא דרושה חוכמה רבה כדי לצייר שלושה קווים. בפייתון אנחנו עושים את זה ככה

plt.plot(gdp.Year, gdp.Israel, '-', label='Israel')
plt.plot(gdp.Year, gdp.France, '-', label='France')
plt.plot(gdp.Year, gdp.Italy, '-', label='Italy')
plt.legend()

השורה האחרונה בקוד עושה קסם קטן ומוסיפה מקרא. זאת התוצאה

גם באקסל קורה קסם קטן

אז איפה פה העיה?

מה קורה כאשר אדם רוצה לדעת איזה קו שייך לאיזו מדינה? אותו האדם נאלץ להשוות בין צבע הקו במקרא לצבע הקו בגרף. מאחר ויש גבול לְמה שאנחנו מסוגלים לשמור בזכרון העבודה שלנו, אנחנו נאלצים לעשות אחד מהשניים: או להעביר את המבט בין קו לקו עשרות פעמים או ״להמציא״ קיצור דרך. קיצורי דרך אינן נחלת העצלנים בלבד. המוח האנושי לא מסוגל לעבוד קשה לאורך זמן הוא חוטר בקביעות להמציא קיצורי דרך (אני מאוד ממליץ על הספר לחשוב מהר לחשוב לאט של דניאל כהנמן). מהו קיצור הדרך במקרה הזה? ובכן, לאורך רוב הגרף, הקו של ישראל נמצא מתחת לקו של איטליה שמנצא מתחת לקו של צרפת. האם אותו הסדר נשמר במקרא? לא ולא. חוסר ההתאמה הזה גורם לדיסוננס, הצופה נאלץ לעבוד קשה, מתעצבן ומפספס שת הפואנטה שלכם. וזה עוד עם שלושה קווים. מה יקרה אם מספר הקווים יגדל?

עכשיו המוח צריך לעבוד עוד יותר קשה כי לא באמת אפשר לזכור את כל הצבעים.

איך משפרים את המצב?

קודם כל נחפש פתרון פשוט וזול, כזה שלא יצריך מאתנו עבודה קשה מדי. אם יש לקווים סדר כלשהו, צריך לדאוג שהסדר הזה יישמר גם במקרא. בפייתון עושים את זה על ידי שינוי סדר הפקודות.

plt.plot(gdp.Year, gdp.Australia, '-', label='Australia')
plt.plot(gdp.Year, gdp.Belgium, '-', label='Belgium')
plt.plot(gdp.Year, gdp.France, '-', label='France')
plt.plot(gdp.Year, gdp.Italy, '-', label='Italy')
plt.plot(gdp.Year, gdp.Israel, '-', label='Israel')
plt.legend()

אנחנו עדיין עודבים קשה אבל לפחות יכולים להסתמך על סדר הקווים. סדר זה עוזר לנו גם אם אנחנו לא רואים את הצבעים בצורה טובה (בגלל מצב גנטי, הגיל או בגלל שמשתמשים במקרן ישן במצגת). זאת הקלה גדולה מאוד.

אם יש זמן

אם יש לנו קצת יותר זמן, אפשר להשקיע ולשפר את המצב עוד יותר ולהפטר מהמקרא בצורתה הקלאסית.

countries = [c for c in gdp.columns if c != 'Year']
fig, ax = plt.subplots()
for i, c in enumerate(countries):
    ax.plot(gdp.Year, gdp[c], '-', color=f'C{i}')
    x = gdp.Year.max()
    y = gdp[c].iloc[-1]
    ax.text(x, y, c, color=f'C{i}', va='center')
seaborn.despine(ax=ax)

.אם אתם לא מבינים את הפייתון שלי, ליבי אתכם אבל לא אסביר את הקוד כאן

נכון שיותר טוב? עכשיו הצופה לא צריך לזכור כלום, העין שלו לא צריכה לקפוץ מהגרף למקרא. וגם אם לא רואים את הצבעים, ברור איזה קו שייך לאיזו מדינה.

ואם כבר טרחנו לעבוד קשה, למה לא להוסיף עוד טיפת עבודה ולהפוך את המקרא לעוד יותר מועילה?

הנה, אותו הגרף, בלי המקרא (הקלאסית) ועם יותר מידע מועיל.

אני יודע מה תגידו: מה יקרה אם הקווים לא מופרדים בקלות? אם נצייר את אותו הגרף עבור שנים 2000 עד 2016 נקבל בלגאן גדול

אתם צודקים. זה אכן בלגן, אבל לא אמרתי שהחיים קלים. גם את הבלגן הזה אפשר לפתור אבל אין לי זמן לטפל בזה. לרנדי אולסון היה זמן תראו מה הוא עשה בעזרת כמה עשרות שורות של קוד.

תראו גם את הפוסט הישן שלי (באנגלית) שמדבר על מקרא.

לסיכום

בלי מקרא עדיף על עם מקרא. העובדה שאתם יכולים להוסיף מקרא לא אומרת שאתם צריכים.

אותו הפוסט באנגלית: [לינק]