מדריך מקיף לניתוח נתונים עסקיים עם Python, Pandas ו-Matplotlib
Python הפך לשפת התכנות המובילה בעולם ניתוח הנתונים. עם ספריות כמו Pandas, NumPy ו-Matplotlib, Python מספק כלים חזקים לניתוח, עיבוד וויזואליזציה של נתונים.
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
Pandas היא הספרייה החשובה ביותר לניתוח נתונים ב-Python. היא מספקת מבני נתונים חזקים לעבודה עם נתונים טבלאיים.
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
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)
ניקוי נתונים הוא שלב קריטי בניתוח נתונים. נתונים נקיים מובילים לתוצאות מדויקות יותר.
# בדיקת ערכים חסרים
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=['צעיר', 'בוגר', 'מבוגר', 'גיל הזהב'])
כעת נלמד טכניקות מתקדמות לניתוח נתונים עם 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 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'}
)
ויזואליזציה היא כלי חזק להצגת תובנות מהנתונים. נלמד ליצור גרפים מקצועיים.
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()
# 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()
ניתוח סטטיסטי עוזר לנו להבין את הנתונים בצורה עמוקה יותר.
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}")
כעת נבצע ניתוח מלא על דוגמה מעשית של נתוני מכירות.
ננתח נתוני מכירות של חברה כדי להבין מגמות, לזהות הזדמנויות ולשפר ביצועים.
# יצירת נתוני דוגמה
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, ניקוי נתונים, ניתוח מתקדם, ויזואליזציה וניתוח סטטיסטי, וסיימנו עם דוגמה מעשית.
זכרו: ניתוח נתונים הוא תהליך איטרטיבי. תמיד בדקו את הנתונים, נקו אותם, וחזרו על הניתוח עד שמגיעים לתובנות משמעותיות!