התחבר / הירשם
מדריך מתקדם

ניתוח נתונים עם Python ו-Pandas

מדריך מקיף לניתוח נתונים עסקיים עם Python, Pandas ו-Matplotlib

90 דקות קריאה רמת קושי: בינוני עודכן לאחרונה: מרץ 2024

תוכן עניינים

1 מבוא לניתוח נתונים עם Python

Python הפך לשפת התכנות המובילה בעולם ניתוח הנתונים. עם ספריות כמו Pandas, NumPy ו-Matplotlib, Python מספק כלים חזקים לניתוח, עיבוד וויזואליזציה של נתונים.

מה נלמד במדריך זה:

  • התקנה והגדרת סביבת Python לניתוח נתונים
  • עבודה עם Pandas DataFrame ו-Series
  • ניקוי ועיבוד נתונים
  • ניתוח נתונים מתקדם וסטטיסטי
  • יצירת ויזואליזציות מקצועיות
  • דוגמאות מעשיות מפרויקטים אמיתיים

למה Python לניתוח נתונים?

Python מציע מספר יתרונות משמעותיים לניתוח נתונים:

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

2 התקנה והגדרת סביבת העבודה

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

התקנת Python

ראשית, נתקין את Python מהאתר הרשמי:


# בדיקת גרסת Python
python --version

# התקנת pip (אם לא מותקן)
python -m ensurepip --upgrade
                    

התקנת הספריות הנדרשות


# התקנת הספריות הבסיסיות
pip install pandas numpy matplotlib seaborn jupyter

# התקנת ספריות נוספות לניתוח מתקדם
pip install scipy scikit-learn plotly
                    

יצירת סביבת עבודה וירטואלית (מומלץ)


# יצירת סביבה וירטואלית
python -m venv data_analysis_env

# הפעלת הסביבה
# Windows:
data_analysis_env\Scripts\activate
# macOS/Linux:
source data_analysis_env/bin/activate

# התקנת הספריות בסביבה החדשה
pip install pandas numpy matplotlib seaborn jupyter
                    

3 יסודות Pandas

Pandas היא הספרייה החשובה ביותר לניתוח נתונים ב-Python. היא מספקת מבני נתונים חזקים לעבודה עם נתונים טבלאיים.

יצירת DataFrame


import pandas as pd
import numpy as np

# יצירת DataFrame מרשימה
data = {
    'שם': ['יוסי', 'שרה', 'דוד', 'מיכל'],
    'גיל': [25, 30, 35, 28],
    'משכורת': [5000, 6000, 7000, 5500],
    'עיר': ['תל אביב', 'ירושלים', 'חיפה', 'באר שבע']
}

df = pd.DataFrame(data)
print(df)

# יצירת DataFrame מקובץ CSV
df = pd.read_csv('data.csv')

# יצירת DataFrame מקובץ Excel
df = pd.read_excel('data.xlsx')
                    

פעולות בסיסיות על DataFrame


# הצגת מידע על ה-DataFrame
print(df.info())
print(df.describe())

# הצגת השורות הראשונות
print(df.head())

# הצגת השורות האחרונות
print(df.tail())

# גישה לעמודות
print(df['שם'])
print(df[['שם', 'גיל']])

# סינון נתונים
young_people = df[df['גיל'] < 30]
high_salary = df[df['משכורת'] > 6000]

# מיון נתונים
df_sorted = df.sort_values('גיל', ascending=False)
                    

4 ניקוי ועיבוד נתונים

ניקוי נתונים הוא שלב קריטי בניתוח נתונים. נתונים נקיים מובילים לתוצאות מדויקות יותר.

טיפול בערכים חסרים


# בדיקת ערכים חסרים
print(df.isnull().sum())

# הסרת שורות עם ערכים חסרים
df_clean = df.dropna()

# מילוי ערכים חסרים
df['גיל'].fillna(df['גיל'].mean(), inplace=True)
df['עיר'].fillna('לא ידוע', inplace=True)

# מילוי עם ערך קודם או הבא
df['משכורת'].fillna(method='ffill', inplace=True)
                    

טיפול בערכים כפולים


# בדיקת ערכים כפולים
print(df.duplicated().sum())

# הסרת ערכים כפולים
df_unique = df.drop_duplicates()

# הסרת כפילויות לפי עמודה ספציפית
df_unique = df.drop_duplicates(subset=['שם'])
                    

טיפול בנתונים לא תקינים


# הסרת תווים מיוחדים
df['שם'] = df['שם'].str.replace('[^\w\s]', '', regex=True)

# המרת סוגי נתונים
df['גיל'] = pd.to_numeric(df['גיל'], errors='coerce')
df['תאריך'] = pd.to_datetime(df['תאריך'])

# יצירת קטגוריות
df['קטגוריית_גיל'] = pd.cut(df['גיל'], 
                            bins=[0, 25, 35, 50, 100], 
                            labels=['צעיר', 'בוגר', 'מבוגר', 'גיל הזהב'])
                    

5 ניתוח נתונים מתקדם

כעת נלמד טכניקות מתקדמות לניתוח נתונים עם Pandas.

קבוצות וניתוח אגרגטיבי


# ניתוח לפי קבוצות
grouped = df.groupby('עיר')

# חישוב סטטיסטיקות לפי קבוצה
city_stats = grouped.agg({
    'גיל': ['mean', 'std', 'count'],
    'משכורת': ['mean', 'min', 'max']
})

print(city_stats)

# ניתוח לפי מספר קבוצות
multi_group = df.groupby(['עיר', 'קטגוריית_גיל'])
salary_by_group = multi_group['משכורת'].mean()
                    

Pivot Tables


# יצירת pivot table
pivot_table = df.pivot_table(
    values='משכורת',
    index='עיר',
    columns='קטגוריית_גיל',
    aggfunc='mean',
    fill_value=0
)

print(pivot_table)

# יצירת pivot table עם מספר ערכים
pivot_multi = df.pivot_table(
    values=['משכורת', 'גיל'],
    index='עיר',
    aggfunc={'משכורת': 'mean', 'גיל': 'count'}
)
                    

6 ויזואליזציה עם Matplotlib

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

הגדרת Matplotlib


import matplotlib.pyplot as plt
import seaborn as sns

# הגדרת עברית
plt.rcParams['font.family'] = 'DejaVu Sans'
plt.rcParams['axes.unicode_minus'] = False

# הגדרת סגנון
plt.style.use('seaborn-v0_8')
sns.set_palette("husl")
                    

יצירת גרפים בסיסיים


# היסטוגרמה
plt.figure(figsize=(10, 6))
plt.hist(df['גיל'], bins=20, alpha=0.7, color='skyblue', edgecolor='black')
plt.title('התפלגות גילאים', fontsize=16)
plt.xlabel('גיל')
plt.ylabel('מספר אנשים')
plt.grid(True, alpha=0.3)
plt.show()

# גרף עמודות
city_salary = df.groupby('עיר')['משכורת'].mean()
plt.figure(figsize=(12, 6))
city_salary.plot(kind='bar', color='lightcoral')
plt.title('משכורת ממוצעת לפי עיר', fontsize=16)
plt.xlabel('עיר')
plt.ylabel('משכורת ממוצעת')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# גרף פיזור
plt.figure(figsize=(10, 6))
plt.scatter(df['גיל'], df['משכורת'], alpha=0.6, s=100)
plt.title('קשר בין גיל למשכורת', fontsize=16)
plt.xlabel('גיל')
plt.ylabel('משכורת')
plt.grid(True, alpha=0.3)
plt.show()
                    

גרפים מתקדמים עם Seaborn


# Box Plot
plt.figure(figsize=(12, 6))
sns.boxplot(data=df, x='עיר', y='משכורת')
plt.title('התפלגות משכורות לפי עיר', fontsize=16)
plt.xticks(rotation=45)
plt.show()

# Heatmap
correlation_matrix = df[['גיל', 'משכורת']].corr()
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('מטריצת קורלציה', fontsize=16)
plt.show()

# Violin Plot
plt.figure(figsize=(12, 6))
sns.violinplot(data=df, x='עיר', y='גיל')
plt.title('התפלגות גילאים לפי עיר', fontsize=16)
plt.xticks(rotation=45)
plt.show()
                    

7 ניתוח סטטיסטי

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

סטטיסטיקה תיאורית


from scipy import stats

# סטטיסטיקה בסיסית
print("סטטיסטיקה תיאורית:")
print(df['משכורת'].describe())

# חישוב מדדים נוספים
print(f"חציון: {df['משכורת'].median()}")
print(f"סטיית תקן: {df['משכורת'].std()}")
print(f"שונות: {df['משכורת'].var()}")
print(f"טווח: {df['משכורת'].max() - df['משכורת'].min()}")

# חישוב אחוזונים
percentiles = [25, 50, 75, 90, 95]
for p in percentiles:
    value = df['משכורת'].quantile(p/100)
    print(f"אחוזון {p}: {value}")
                    

בדיקת התפלגות


# בדיקת נורמליות
from scipy.stats import shapiro, normaltest

# Shapiro-Wilk test
stat, p_value = shapiro(df['משכורת'])
print(f"Shapiro-Wilk test: p-value = {p_value}")

# D'Agostino test
stat, p_value = normaltest(df['משכורת'])
print(f"D'Agostino test: p-value = {p_value}")

# יצירת Q-Q plot
from scipy.stats import probplot
plt.figure(figsize=(10, 6))
probplot(df['משכורת'], dist="norm", plot=plt)
plt.title('Q-Q Plot - בדיקת נורמליות', fontsize=16)
plt.show()
                    

בדיקת השערות


# t-test להשוואת ממוצעים
from scipy.stats import ttest_ind

# השוואת משכורות בין שתי ערים
tel_aviv_salary = df[df['עיר'] == 'תל אביב']['משכורת']
jerusalem_salary = df[df['עיר'] == 'ירושלים']['משכורת']

t_stat, p_value = ttest_ind(tel_aviv_salary, jerusalem_salary)
print(f"t-test: t-statistic = {t_stat}, p-value = {p_value}")

# ANOVA להשוואת מספר קבוצות
from scipy.stats import f_oneway

cities = df['עיר'].unique()
salary_groups = [df[df['עיר'] == city]['משכורת'] for city in cities]

f_stat, p_value = f_oneway(*salary_groups)
print(f"ANOVA: F-statistic = {f_stat}, p-value = {p_value}")
                    

8 דוגמה מעשית

כעת נבצע ניתוח מלא על דוגמה מעשית של נתוני מכירות.

תרחיש: ניתוח נתוני מכירות

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

טעינת ועיבוד הנתונים


# יצירת נתוני דוגמה
np.random.seed(42)
dates = pd.date_range('2023-01-01', '2023-12-31', freq='D')
n_days = len(dates)

sales_data = {
    'תאריך': dates,
    'מוצר': np.random.choice(['מוצר A', 'מוצר B', 'מוצר C'], n_days),
    'כמות': np.random.poisson(50, n_days),
    'מחיר': np.random.uniform(100, 500, n_days),
    'אזור': np.random.choice(['צפון', 'דרום', 'מרכז'], n_days)
}

df_sales = pd.DataFrame(sales_data)
df_sales['הכנסה'] = df_sales['כמות'] * df_sales['מחיר']

print("נתוני מכירות:")
print(df_sales.head())
print(f"\nצורת הנתונים: {df_sales.shape}")
                    

ניתוח מגמות


# ניתוח לפי חודשים
df_sales['חודש'] = df_sales['תאריך'].dt.month
monthly_sales = df_sales.groupby('חודש')['הכנסה'].sum()

plt.figure(figsize=(12, 6))
monthly_sales.plot(kind='line', marker='o', linewidth=2, markersize=8)
plt.title('מגמת מכירות חודשית 2023', fontsize=16)
plt.xlabel('חודש')
plt.ylabel('הכנסה')
plt.grid(True, alpha=0.3)
plt.xticks(range(1, 13))
plt.show()

# ניתוח לפי מוצרים
product_performance = df_sales.groupby('מוצר').agg({
    'הכנסה': 'sum',
    'כמות': 'sum',
    'מחיר': 'mean'
}).round(2)

print("ביצועי מוצרים:")
print(product_performance)
                    

ניתוח לפי אזורים


# ניתוח לפי אזורים
region_analysis = df_sales.groupby('אזור').agg({
    'הכנסה': ['sum', 'mean'],
    'כמות': 'sum',
    'מוצר': 'count'
}).round(2)

print("ניתוח לפי אזורים:")
print(region_analysis)

# ויזואליזציה
plt.figure(figsize=(15, 5))

# גרף 1: הכנסה לפי אזור
plt.subplot(1, 3, 1)
region_income = df_sales.groupby('אזור')['הכנסה'].sum()
region_income.plot(kind='bar', color=['lightblue', 'lightgreen', 'lightcoral'])
plt.title('הכנסה לפי אזור')
plt.ylabel('הכנסה')
plt.xticks(rotation=45)

# גרף 2: כמות מכירות לפי אזור
plt.subplot(1, 3, 2)
region_quantity = df_sales.groupby('אזור')['כמות'].sum()
region_quantity.plot(kind='bar', color=['lightblue', 'lightgreen', 'lightcoral'])
plt.title('כמות מכירות לפי אזור')
plt.ylabel('כמות')
plt.xticks(rotation=45)

# גרף 3: ממוצע מחיר לפי אזור
plt.subplot(1, 3, 3)
region_price = df_sales.groupby('אזור')['מחיר'].mean()
region_price.plot(kind='bar', color=['lightblue', 'lightgreen', 'lightcoral'])
plt.title('ממוצע מחיר לפי אזור')
plt.ylabel('מחיר ממוצע')
plt.xticks(rotation=45)

plt.tight_layout()
plt.show()
                    

סיכום המדריך:

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

זכרו: ניתוח נתונים הוא תהליך איטרטיבי. תמיד בדקו את הנתונים, נקו אותם, וחזרו על הניתוח עד שמגיעים לתובנות משמעותיות!