14 KiB
חזותיות של קשרים: הכל על דבש 🍯
![]() |
---|
חזותיות של קשרים - סקיצה מאת @nitya |
בהמשך להתמקדות שלנו בטבע במחקר, בואו נגלה חזותיות מעניינות שמציגות את הקשרים בין סוגי דבש שונים, על פי מערך נתונים שמקורו ב-משרד החקלאות של ארצות הברית.
מערך הנתונים הזה, שמכיל כ-600 פריטים, מציג את ייצור הדבש במדינות רבות בארצות הברית. לדוגמה, ניתן לבחון את מספר הכוורות, התפוקה לכל כוורת, הייצור הכולל, המלאי, המחיר לקילוגרם, והערך של הדבש שיוצר במדינה מסוימת בין השנים 1998-2012, עם שורה אחת לכל שנה עבור כל מדינה.
יהיה מעניין להציג חזותית את הקשר בין ייצור הדבש במדינה מסוימת בשנה נתונה לבין, לדוגמה, המחיר של הדבש באותה מדינה. לחלופין, ניתן להציג את הקשר בין תפוקת הדבש לכל כוורת במדינות השונות. טווח השנים הזה כולל את התופעה ההרסנית 'CCD' או 'קריסת מושבות' שנצפתה לראשונה בשנת 2006 (http://npic.orst.edu/envir/ccd.html), ולכן זהו מערך נתונים מרגש ללימוד. 🐝
שאלון לפני השיעור
בשיעור הזה, תוכלו להשתמש ב-Seaborn, ספרייה שכבר השתמשתם בה בעבר, כדי להציג חזותית קשרים בין משתנים. במיוחד מעניין להשתמש בפונקציה relplot
של Seaborn, שמאפשרת ליצור גרפים פזורים וגרפי קווים כדי להציג במהירות 'קשרים סטטיסטיים', שמאפשרים למדען הנתונים להבין טוב יותר כיצד משתנים קשורים זה לזה.
גרפים פזורים
השתמשו בגרף פזור כדי להציג כיצד המחיר של הדבש התפתח משנה לשנה, לפי מדינה. Seaborn, באמצעות relplot
, מקבץ בנוחות את נתוני המדינות ומציג נקודות נתונים עבור נתונים קטגוריים ומספריים כאחד.
נתחיל בייבוא הנתונים ו-Seaborn:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
honey = pd.read_csv('../../data/honey.csv')
honey.head()
שימו לב שמערך הנתונים של הדבש כולל כמה עמודות מעניינות, כולל שנה ומחיר לקילוגרם. בואו נחקור את הנתונים האלה, מקובצים לפי מדינות בארצות הברית:
מדינה | numcol | yieldpercol | totalprod | stocks | priceperlb | prodvalue | year |
---|---|---|---|---|---|---|---|
AL | 16000 | 71 | 1136000 | 159000 | 0.72 | 818000 | 1998 |
AZ | 55000 | 60 | 3300000 | 1485000 | 0.64 | 2112000 | 1998 |
AR | 53000 | 65 | 3445000 | 1688000 | 0.59 | 2033000 | 1998 |
CA | 450000 | 83 | 37350000 | 12326000 | 0.62 | 23157000 | 1998 |
CO | 27000 | 72 | 1944000 | 1594000 | 0.7 | 1361000 | 1998 |
צרו גרף פזור בסיסי כדי להציג את הקשר בין המחיר לקילוגרם של דבש לבין מדינת המקור שלו. הפכו את ציר ה-y
לגבוה מספיק כדי להציג את כל המדינות:
sns.relplot(x="priceperlb", y="state", data=honey, height=15, aspect=.5);
כעת, הציגו את אותם נתונים עם ערכת צבעים של דבש כדי להראות כיצד המחיר מתפתח לאורך השנים. ניתן לעשות זאת על ידי הוספת פרמטר 'hue' כדי להציג את השינוי משנה לשנה:
✅ למדו עוד על ערכות הצבעים שניתן להשתמש בהן ב-Seaborn - נסו ערכת צבעים יפהפייה של קשת!
sns.relplot(x="priceperlb", y="state", hue="year", palette="YlOrBr", data=honey, height=15, aspect=.5);
עם שינוי ערכת הצבעים, ניתן לראות בבירור התקדמות חזקה לאורך השנים מבחינת המחיר לקילוגרם של דבש. למעשה, אם תבדקו קבוצת נתונים לדוגמה כדי לאמת (בחרו מדינה מסוימת, למשל אריזונה), תוכלו לראות דפוס של עליית מחירים משנה לשנה, עם מעט יוצאים מן הכלל:
מדינה | numcol | yieldpercol | totalprod | stocks | priceperlb | prodvalue | year |
---|---|---|---|---|---|---|---|
AZ | 55000 | 60 | 3300000 | 1485000 | 0.64 | 2112000 | 1998 |
AZ | 52000 | 62 | 3224000 | 1548000 | 0.62 | 1999000 | 1999 |
AZ | 40000 | 59 | 2360000 | 1322000 | 0.73 | 1723000 | 2000 |
AZ | 43000 | 59 | 2537000 | 1142000 | 0.72 | 1827000 | 2001 |
AZ | 38000 | 63 | 2394000 | 1197000 | 1.08 | 2586000 | 2002 |
AZ | 35000 | 72 | 2520000 | 983000 | 1.34 | 3377000 | 2003 |
AZ | 32000 | 55 | 1760000 | 774000 | 1.11 | 1954000 | 2004 |
AZ | 36000 | 50 | 1800000 | 720000 | 1.04 | 1872000 | 2005 |
AZ | 30000 | 65 | 1950000 | 839000 | 0.91 | 1775000 | 2006 |
AZ | 30000 | 64 | 1920000 | 902000 | 1.26 | 2419000 | 2007 |
AZ | 25000 | 64 | 1600000 | 336000 | 1.26 | 2016000 | 2008 |
AZ | 20000 | 52 | 1040000 | 562000 | 1.45 | 1508000 | 2009 |
AZ | 24000 | 77 | 1848000 | 665000 | 1.52 | 2809000 | 2010 |
AZ | 23000 | 53 | 1219000 | 427000 | 1.55 | 1889000 | 2011 |
AZ | 22000 | 46 | 1012000 | 253000 | 1.79 | 1811000 | 2012 |
דרך נוספת להציג את ההתקדמות הזו היא להשתמש בגודל במקום בצבע. עבור משתמשים עיוורי צבעים, זו עשויה להיות אפשרות טובה יותר. ערכו את החזותיות שלכם כדי להציג עלייה במחיר באמצעות עלייה בהיקף הנקודות:
sns.relplot(x="priceperlb", y="state", size="year", data=honey, height=15, aspect=.5);
ניתן לראות את גודל הנקודות גדל בהדרגה.
האם מדובר במקרה פשוט של היצע וביקוש? בשל גורמים כמו שינויי אקלים וקריסת מושבות, האם יש פחות דבש זמין לרכישה משנה לשנה, ולכן המחיר עולה?
כדי לגלות קשר בין כמה מהמשתנים במערך הנתונים הזה, בואו נחקור כמה גרפי קווים.
גרפי קווים
שאלה: האם יש עלייה ברורה במחיר הדבש לקילוגרם משנה לשנה? ניתן לגלות זאת בקלות על ידי יצירת גרף קו יחיד:
sns.relplot(x="year", y="priceperlb", kind="line", data=honey);
תשובה: כן, עם כמה יוצאים מן הכלל סביב שנת 2003:
✅ מכיוון ש-Seaborn מאגד נתונים סביב קו אחד, הוא מציג "את המדידות המרובות בכל ערך x על ידי שרטוט הממוצע והאינטרוול של 95% סביב הממוצע". מקור. ניתן לבטל את ההתנהגות הזו על ידי הוספת ci=None
.
שאלה: ובכן, בשנת 2003 האם ניתן לראות גם עלייה בהיצע הדבש? מה אם תסתכלו על הייצור הכולל משנה לשנה?
sns.relplot(x="year", y="totalprod", kind="line", data=honey);
תשובה: לא ממש. אם תסתכלו על הייצור הכולל, נראה שהוא דווקא עלה בשנה הזו, למרות שבאופן כללי כמות הדבש שמיוצרת נמצאת בירידה במהלך השנים הללו.
שאלה: במקרה כזה, מה יכול היה לגרום לעלייה במחיר הדבש סביב שנת 2003?
כדי לגלות זאת, ניתן לחקור רשתות פן.
רשתות פן
רשתות פן לוקחות פן אחד ממערך הנתונים שלכם (במקרה שלנו, ניתן לבחור 'שנה' כדי להימנע מיצירת יותר מדי פן). Seaborn יכול ליצור גרף עבור כל אחד מהפן של הקואורדינטות x ו-y שבחרתם להשוואה קלה יותר. האם שנת 2003 בולטת בהשוואה מסוג זה?
צרו רשת פן על ידי המשך השימוש ב-relplot
כפי שמומלץ על ידי התיעוד של Seaborn.
sns.relplot(
data=honey,
x="yieldpercol", y="numcol",
col="year",
col_wrap=3,
kind="line"
בחזותיות הזו, ניתן להשוות את התפוקה לכל כוורת ומספר הכוורות משנה לשנה, זו לצד זו עם הגדרה של wrap ל-3 עבור העמודות:
עבור מערך הנתונים הזה, שום דבר לא בולט במיוחד בכל הנוגע למספר הכוורות והתפוקה שלהן, משנה לשנה ומדינה למדינה. האם יש דרך אחרת לחפש קשר בין שני המשתנים הללו?
גרפי קווים כפולים
נסו גרף רב-קווי על ידי העלאת שני גרפי קווים זה על גבי זה, תוך שימוש ב-'despine' של Seaborn להסרת הקוצים העליונים והימניים שלהם, ושימוש ב-ax.twinx
שמקורו ב-Matplotlib. Twinx מאפשר לגרף לשתף את ציר ה-x ולהציג שני צירי y. אז, הציגו את התפוקה לכל כוורת ומספר הכוורות, זה על גבי זה:
fig, ax = plt.subplots(figsize=(12,6))
lineplot = sns.lineplot(x=honey['year'], y=honey['numcol'], data=honey,
label = 'Number of bee colonies', legend=False)
sns.despine()
plt.ylabel('# colonies')
plt.title('Honey Production Year over Year');
ax2 = ax.twinx()
lineplot2 = sns.lineplot(x=honey['year'], y=honey['yieldpercol'], ax=ax2, color="r",
label ='Yield per colony', legend=False)
sns.despine(right=False)
plt.ylabel('colony yield')
ax.figure.legend();
למרות ששום דבר לא קופץ לעין סביב שנת 2003, זה מאפשר לנו לסיים את השיעור הזה בנימה מעט שמחה יותר: למרות שיש ירידה כללית במספר הכוורות, מספר הכוורות מתייצב גם אם התפוקה שלהן לכל כוורת יורדת.
קדימה, דבורים, קדימה!
🐝❤️
🚀 אתגר
בשיעור הזה, למדתם קצת יותר על שימושים אחרים של גרפים פזורים ורשתות קווים, כולל רשתות פן. אתגרו את עצמכם ליצור רשת פן באמצעות מערך נתונים אחר, אולי כזה שהשתמשתם בו לפני השיעורים הללו. שימו לב כמה זמן לוקח ליצור אותם וכיצד עליכם להיזהר בכמות הרשתות שאתם צריכים לצייר באמצעות הטכניקות הללו.
שאלון אחרי השיעור
סקירה ולימוד עצמי
גרפי קווים יכולים להיות פשוטים או מורכבים למדי. עשו קצת קריאה בתיעוד של Seaborn על הדרכים השונות שבהן ניתן לבנות אותם. נסו לשפר את גרפי הקווים שבניתם בשיעור הזה עם שיטות אחרות שמופיעות בתיעוד.
משימה
כתב ויתור:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית Co-op Translator. למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי-דיוקים. המסמך המקורי בשפתו המקורית נחשב למקור הסמכותי. למידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי בני אדם. איננו נושאים באחריות לכל אי-הבנה או פרשנות שגויה הנובעת משימוש בתרגום זה.