Python ile E-Ticaret Satış Analizi
Daha önceki “Python ile Veri Temizleme İşlemleri” yazılımızda Kaggle üzerinden bir veri seti alıp veri temizleme işlemlerimizi gerçekleştirmiştik. Şimdi ise temizlediğimiz bu veriler ile bir e-ticaret sitesinin satış analizini yapacağız. Bu işlemler için Jupyter Notebook kullanacağız.
Bu veri setindeki analizi yapabilmek için Python’da Pandas, Matplotlib ve Seaborn kütüphanelerini kullanacağız.
Ürünlerini Mobilya, Ofis Gereçleri ve Teknoloji olarak gruplandıran bir mağazanın müşterileri; Bireysel, Kurumsal veya Home Ofis çalışan bir kitledir. Bu projenin amacı, satış verilerinin derinlemesine analizini sağlamak ve aşağıdaki soruları yanıtlamaktır:
- En çok/en az gelir ve kârı hangi alt kategoriler sağlıyor?
- En çok/en az kârlı olan ürünler nelerdir?
- En çok satışı ve kârı hangi eyaletler sağlıyor?
- Müşterilerin satın alma alışkanlıkları nelerdir?
- Tavsiyeler nelerdir?
Gerekli kütüphanelerin içeri aktarılması
İlk adımda, gerekli kütüphaneleri import etmemiz gerekiyor.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
storeData = pd.read_csv('./storeData.csv', encoding='cp1252')
Kar Marjı
Analizde ihtiyaç duyacağımız için kar marjı sütununu oluşturuyoruz.
# Kar marjı sütununu oluşturuyoruz
storeData['Profit Margin']=(storeData.Profit/storeData.Sales)*100
storeData.columns
Sonuç:
Index(['Order Date', 'Ship Date', 'Ship Mode', 'Customer ID', 'Customer Name',
'Segment', 'City', 'State', 'Postal Code', 'Region', 'Product ID',
'Category', 'Sub-Category', 'Product Name', 'Sales', 'Quantity',
'Discount', 'Profit', 'Profit Margin'],
dtype='object')
Özet Rapor
describe() metodu sayısal verilere sahip olan sütunların max, min , std…gibi istatiksel değerlerini döndürür.
storeData.describe(include = "all")
Describe metodunun döndüğü sonuçta veriyi bu şekilde okuyabiliriz.
count # Kaç adet kayıt olduğu
unique # Birbirinden farklı kaç kategori olduğu
mean # Average değeri
std # Standard sapma değeri
min # Bu seride minimum değer
25% # Toplam kayıtların %25 'i nin ortalama değeri
50% # Toplam kayıtların %50'i nin ortalama değeri
75% # Toplam kayıtların %75 'i nin ortalama değeri
max # Bu seride maximum değer
top # Sütunda en çok bulunan kategorinin adı.
freq # En çok bulunan kategorinin sütunda bulunma sıklığı
Sayısal olmayan tüm sütunların istatiksel özetini görmek istiyorsak include=[‘O’] parametresini kullanmalıyız.
storeData.describe(include=['O'])
Verileri kategorilerine göre gruplayalım.
cat_analysis=pd.DataFrame(storeData.groupby(['Category'])[['Sales', 'Profit', 'Quantity']].sum())
cat_analysis
sns.set_theme(style="whitegrid")
figure, axis = plt.subplots(1, 3, figsize=(8, 5))
# Her kategori için grafik çizgilerini tanımla
cat1 = sns.barplot(x = cat_analysis.index, y = cat_analysis.Sales, ax=axis[0])
cat2 = sns.barplot(x = cat_analysis.index, y = cat_analysis.Profit, ax=axis[1])
cat3 = sns.barplot(x = cat_analysis.index, y = cat_analysis.Quantity, ax=axis[2])
# Başlıkları tanımla
cat1.set(title = 'Sales')
cat2.set(title = 'Profit')
cat3.set(title = 'Quantity')
# x eksenindeki başlıklar yan yana sığmayacağı için dikey olarak çeviriyoruz
plt.setp(cat1.get_xticklabels(), rotation = 'vertical', size = 9)
plt.setp(cat2.get_xticklabels(), rotation = 'vertical', size = 9)
plt.setp(cat3.get_xticklabels(), rotation = 'vertical', size = 9)
# Grafikler arasındaki boşlukları ayarla
figure.tight_layout()
Şimdi de en başta belirttiğimiz analiz sorularını yanıtlamaya çalışalım.
Alt kategorilerimizin kâr marjları ile birlikte ve satışları ile birlikte listeleyelim.
sub_analysis=pd.DataFrame(storeData.groupby(['Sub-Category'])[['Sales', 'Profit', 'Quantity']].sum())
sub_analysis
1. Hangi kategoriler en çok/en az gelir ve kâr sağlar?
# Alt kategorileri gruplayalım
subcat_analysis = pd.DataFrame(storeData.groupby(['Sub-Category'])[['Sales', 'Profit','Quantity']].sum())
# Azalan sıralamaya göre satış verisi
subcat_sales = pd.DataFrame(subcat_analysis.sort_values('Sales', ascending = False))
# Azalan sıralamaya göre kâr verisi
subcat_profit = pd.DataFrame(subcat_analysis.sort_values('Profit', ascending = False))
# Azalan sıralamaya göre satın alma miktarları
subcat_quantity = pd.DataFrame(subcat_analysis.sort_values('Quantity', ascending = False))
# Çizim grafiği
sns.set_theme(style="whitegrid")
figure, axis = plt.subplots(1, 2, figsize=(12, 6))
# En çok satan alt kategori
subcat1 = sns.barplot(data = subcat_sales, x = subcat_sales.index, y = subcat_sales.Sales, ax=axis[0])
subcat1.set(title="Best Selling Sub-Category")
subcat1.set_xticklabels(subcat1.get_xticklabels(),rotation = "vertical", size = 10)
# En kârlı alt kategori
subcat2 = sns.barplot(data = subcat_profit, x = subcat_profit.index, y = subcat_profit.Profit, ax=axis[1])
subcat2.set(title = "Most Profitable Sub-Category")
subcat2.set_xticklabels(subcat2.get_xticklabels(),rotation = "vertical", size = 10)
# En çok satan alt kategori
subcat3 = sns.barplot(data = subcat_profit, x = subcat_quantity.index, y = subcat_quantity.Quantity, ax=axis[2])
subcat3.set(title = "Most Ordered Sub-Category")
subcat3.set_xticklabels(subcat3.get_xticklabels(),rotation = "vertical", size = 10)
# Grafikler arasındaki boşlukları ayarlar
figure.tight_layout()
plt.show()
Yukarıdaki analize göre telefonlar ve sandalyeler en fazla geliri sağlamış durumda. Bağlantı elemanları ve etiketler de en az geliri sağladı. En az kâr eden kategori ise “masalar” oldu.
2. Hangi ürünler en çok/en az karlı?
# Ürün adını Kâr'a göre grupladık
product_analysis = pd.DataFrame(storeData.groupby(['Product Name'])[['Profit', 'Sales', 'Quantity']].sum())
# Azalan sıralamaya göre satış verisi
product_sales = pd.DataFrame(product_analysis.sort_values('Sales', ascending = False))
# Azalan sıralamaya göre kâr marjı
product_profit = pd.DataFrame(product_analysis.sort_values('Profit', ascending = False))
# Azalan sıralamaya göre satış miktarları
product_quantity = pd.DataFrame(product_analysis.sort_values('Quantity', ascending = False))
# Kâr marjına göre ilk beş ürünü listeliyoruz.
product_profit.head()
Canon ImageClass Fotokopi Makinesi en çok satan ve en karlı ürünken, Cubify CubeX 3D Yazıcılar ve Lexmark Lazer Yazıcı en az karlı olan ürünlerdir.
# En az kar eden ürünler
product_profit.tail()
3. Hangi eyaletler en çok/en az satış ve kar sağlıyor?
# Satış, kar ve miktara göre gruplandıralım
state_group = pd.DataFrame(storeData.groupby(['State'])[['Sales', 'Profit', 'Quantity']].sum())
# Azalan sıralamaya göre satış verisi
state_sales = pd.DataFrame(state_group.sort_values('Sales', ascending = False))
# Satışlara göre ilk beş eyaletin kar ve miktar durumları
state_sales.head()
California ve New York, mağazanın toplam satışlarının %64'ünü ve mağazanın toplam kârının %66'sını oluşturarak en yüksek satış ve kâra sahip oldu.
# En az kar eden eyaletler
state_sales.tail()
En az kâr eden eyaletler ise Kuzey Dakota ve Batı Virginia.
4. Müşterilerin satın alma alışkanlıkları nelerdir?
Oluşturduğumuz analiz verilerine dayanarak aşağıdaki çıkarımları yapabiliriz.
- Toplam 693 müşterinin %75'i en az 5 kez ve %11'i 10'dan fazla sipariş verdi.
- Toplam 5009 siparişin yalnızca 12'si tek seferlik sipariştir.
- Tüm siparişlerin %60'ı ofis malzemelerinden oluşmaktadır.
5. Tavsiyeler
- Çok satan bir ürün olduğu için masaların fiyatını artırmak düşünülebilir.
- Kitaplıklar ve Sarf Malzemeleri ürün listesinden çıkarılabilir veya daha ucuz bir fiyat için tedarikçilerle görüşülebilir.
- Müşteri ekipleri; satış ve pazarlama hedeflerini yönlendirmek için etkin olmayan müşterileri hedefleyebilir.
- İlişkiyi sürdürmek ve müşteri kaybını önlemek için favori ürünlerde özel indirimler sunulabilir.
Bu yazımızda örnek bir e-ticaret veri seti ile veri analizi yapmaya çalıştık. Projenin Jupyter Notebook ile hazırlanmış haline https://github.com/emrealtin/python-sales-analytics reposu üzerinden erişebilirsiniz. Umarım faydalı olmuştur.