<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Bahar Kayan on Medium]]></title>
        <description><![CDATA[Stories by Bahar Kayan on Medium]]></description>
        <link>https://medium.com/@baharkyn?source=rss-e433c790981f------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*mjFG4wLZBCeFUysTUpSgtQ.png</url>
            <title>Stories by Bahar Kayan on Medium</title>
            <link>https://medium.com/@baharkyn?source=rss-e433c790981f------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 06:08:00 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@baharkyn/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[RFM Analizi ile Müşteri Segmentasyonu]]></title>
            <link>https://medium.com/@baharkyn/rfm-analizi-ile-m%C3%BC%C5%9Fteri-segmentasyonu-29dfcd6c7934?source=rss-e433c790981f------2</link>
            <guid isPermaLink="false">https://medium.com/p/29dfcd6c7934</guid>
            <dc:creator><![CDATA[Bahar Kayan]]></dc:creator>
            <pubDate>Mon, 29 Jun 2020 21:49:04 GMT</pubDate>
            <atom:updated>2020-06-30T17:00:44.807Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/963/1*4EG7tS2Zn_DNpz8XKvU7Iw.png" /></figure><p>Merhaba güzel insanlar!</p><p>Bugün sizlere Veri Bilimi dünyasında sıkça kullanılan bir yöntem olan, müşterileri segmentlere ayırarak, bu müşterilere bulundukları segmentlere özel pazarlama stratejileri geliştirme işlemlerinin nasıl yapıldığından, verileri nasıl yorumladıklarından ve alınabilecek aksiyon kararlarından bahsedeceğim. Bunun için kullanılan RFM Analizini gelin yakından tanıyalım.</p><p><strong>Nedir bu RFM?</strong></p><p>Recency, Frequency, Monetory kelimelerinin baş harflerinden oluşur.</p><ul><li><strong>Recency :</strong> Müşterinin son temasından bugüne kadar geçen süredir.</li><li><strong>Frequency :</strong> Müşterinin toplam satın alma sayısıdır.</li><li><strong>Monetary :</strong> Müşterinin yaptığı toplam harcamadır.</li></ul><p>Bu değerlerin 1 ile 5 arasında puanlanarak müşterilerin gruplara ayrılması işlemine de “Müşteri Segmentasyonu” denir. Örnek segmentler aşağıdaki görselde sunulmuştur.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/684/1*p1VeDx3XjN4d2P0SFKc6vw.png" /></figure><p>Bu görsele göre amaç, bütün müşteri gruplarımızı daima “champions” grubuna çekmektir. Yani hem Recency hem Frequency değerlerini arttırmak hedeflenir.</p><p>Şimdi ise örnek bir veri seti üzerinden, müşterileri segmentlere ayırma işlemi yaparak pazarlama stratejileri geliştirip, aksiyon fikri önereceğim. Geliştirmeler <strong>Kaggle</strong> üzerinde <strong>Python</strong> ile yapılmıştır.Ayrıca <strong>Kaggle</strong> platformunda paylaşılmış olup notebook olarak kaydedilmiştir. Dilerseniz aşağıdaki linkten notebook detayına da erişebilirsiniz :<br><a href="https://www.kaggle.com/baharkayan/rfm-analizi-ile-m-teri-segmentasyonu">https://www.kaggle.com/baharkayan/rfm-analizi-ile-m-teri-segmentasyonu</a></p><h3>1). Giriş</h3><p><a href="https://www.kaggle.com/nathaniel/uci-online-retail-ii-data-set">https://www.kaggle.com/nathaniel/uci-online-retail-ii-data-set</a> linkindeki veri setini kullanarak;</p><ol><li>Veri setini “Satış Verileri” ve “İade Verileri” olarak ayıracağım.</li><li>Satış verisini anlamlandırma ve veri ön işleme adımlarını uygulayacağım.</li><li>Satış veri setine <strong>RFM Analizi</strong> ile <strong>Müşteri Segmentasyonu</strong> işlemini gerçekleştirip, çıkan sonucu pazarlama stratejilerine yönelik aksiyon kararları açısından yorumlayacağım.</li></ol><p><strong>Veri Seti Hakkında Genel Bilgiler :</strong></p><p>“online_retail_II” isimli veri seti İngiltere merkezli online bir satış mağazasının 01/12/2009–09/12/2011 tarihleri arasındaki satışlarını içermektedir. Bu şirket hediyelik eşya satmaktadır. Promosyon ürünleri gibi düşünebilir. Müşterilerinin çoğu da toptancıdır.</p><p>Excelde 2 sheet bulunmaktadır. Ben RFM Analizi için “Year 2010–2011” olan 2. sheeti kullanacağım.</p><ul><li>1.Sheet : Year 2009–2010</li><li>2.Sheet : Year 2010–2011</li></ul><p><strong>Değişkenler:</strong></p><ul><li><strong>InvoiceNo:</strong> Fatura numarası. Eşsiz bir değerdir. Eğer bu kod C ile başlıyorsa, iade anlamına gelir</li><li><strong>StockCode: </strong>Ürün kodu. Her bir ürün için eşsiz numaradır</li><li><strong>Description:</strong> Ürün ismi</li><li><strong>Quantity:</strong> Ürün adedi. Faturalardaki ürünlerden kaçar tane satıldığını ifade etmektedir. C ile başlayanlarda negatif değer almaktadır</li><li><strong>InvoiceDate:</strong> Fatura tarihi ve zamanı</li><li><strong>UnitPrice: </strong>Ürün fiyatı (Sterlin cinsinden)</li><li><strong>CustomerID: </strong>Müşteri numarası. Her bir müşteri için eşsiz numaradır</li><li><strong>Country: </strong>Ülke ismi. Müşterinin yaşadığı ülkeyi ifade eder</li></ul><p>Linkteki veri setini <strong>“+ Add data”</strong> butonu ile notebookuma dahil ettim.</p><h3>2). Kütüphane Ayarları</h3><p>Bu bölümde, uygulama sırasında genel olarak kullanacağım yapıları ayarlıyorum. Örneğin;</p><ul><li>görselimi bozmaması için warningleri kapatmak,</li><li>sayısal değişkenlerde virgülden sonraki basamak sayısını 2 olarak ayarlamak,</li><li>dataframe çıktılarında tüm çıktıların atlanmadan, aralara üç nokta(…) konulmasını sağlamadan alabilmek.</li></ul><pre><em>#Warningleri çalışmamda görmek istemediğim için kapatıyorum.</em><br>import warnings<br>warnings.simplefilter(action=&#39;ignore&#39;)<br></pre><pre>import pandas as pd</pre><pre><em>#virgulden sonra gösterilecek olan sayı 2 basamak olarak ayarlanıyor.</em><br>pd.set_option(&#39;display.float_format&#39;, lambda x: &#39;<strong>%.2f</strong>&#39; % x)</pre><pre><em>#Çıktılarda tüm satır ve sütunları görebilmek için kütüphane ayarı yapılıyor.</em><br>pd.set_option(&#39;display.max_columns&#39;, None); <br>pd.set_option(&#39;display.max_rows&#39;, None);</pre><h3>3). Veri Okuma</h3><pre><em>#Excel okuma işlemini gerçekleştiriyorum. 2.Sheet olan &quot;Year 2010-2011&quot; üzerinden çalışmamı gerçekleştireceğim.</em><br><em>#&quot;df&quot; isimli Dataframe yapımı oluşturuyorum.</em></pre><pre>df_2010_2011 = pd.read_excel(&quot;../input/uci-online-retail-ii-data-set/online_retail_II.xlsx&quot;, sheet_name = &quot;Year 2010-2011&quot;)<br>df = df_2010_2011.copy()</pre><pre><em>#İade faturalarım için df_iade isimli dataframe yapımı oluşturuyorum. &quot;Invoice&quot; kolonu &quot;C&quot; ile başlayanları bu dataframe&#39;e atıyorum.</em></pre><pre>df_iade = df[df[&quot;Invoice&quot;].str.startswith(&quot;C&quot;, na = False)]</pre><pre><em>#Orjinal dataframe yapımdan iadeleri çıkartarak, satış verilerini çekiyorum, df_satis olarak kaydediyorum.</em></pre><pre>df_satis = df[~(df[&quot;Invoice&quot;].str.startswith(&quot;C&quot;, na = False))]</pre><h3>4). Veri Ön İşleme</h3><pre><em># Satış veri setinde NaN kontrolü yapıyorum. Değişken bazında NaN olan sayılara bakacağım.</em><br><em># &quot;Description&quot; için 1454 değerin, &quot;Customer ID&quot; için 134697 değerin NaN olduğunu gözlemledim.</em><br>df_satis.isnull().sum()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/723/1*uEaIOMcuJKFNcZLC8N57pQ.png" /></figure><pre><em>#Customer ID değerleri NaN olanlar, RFM Analizinde işime yaramayacağı için uçuruyorum.</em></pre><pre>df_satis.dropna(subset=[&#39;Customer ID&#39;], how=&#39;all&#39;, inplace=True)</pre><pre><em>#Satış veri setinde hiç NaN veri kalmadığını gözlemledim. </em><br><em>#Buradan, Description değeri NaN olan tüm kayıtların, Customer ID değerlerinin de NaN olduğu bilgisini çıkarttım.</em></pre><pre>df_satis.isnull().sum()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/726/1*B1iGP3kP_bTwx5KX-m6ynw.png" /></figure><pre><em>#Satış veri setindeki silinen NaN değerlerinin sayısını tutuyorum. Aşağıda doğrulama için kullanacağım.</em></pre><pre>satis_nan = 134697</pre><pre><em># İade veri setinde NaN kontrolü yapıyorum. Değişken bazında NaN olan sayılara bakacağım.</em><br><em># &quot;Customer ID&quot; için 383 değerin NaN olduğunu gözlemledim.</em></pre><pre>df_iade.isnull().sum()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/1*Z7Ul8PXm4-CuoPJR-Zj0dQ.png" /></figure><pre><em>#Customer ID değerleri NaN olanları müşteri bazında yorumlayamayacağım ve işime yaramayacağı için uçuruyorum.</em></pre><pre>df_iade.dropna(subset=[&#39;Customer ID&#39;], how=&#39;all&#39;, inplace=True)</pre><pre><em>#İade veri setinde hiç NaN veri kalmadığını gözlemledim. </em></pre><pre>df_iade.isnull().sum()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/723/1*ec7mMx0pcHHLTrzG3Tevyg.png" /></figure><pre><em>#İade veri setindeki silinen NaN değerlerinin sayısını tutuyorum. Aşağıda doğrulama için kullanacağım.</em></pre><pre>iade_nan = 383</pre><pre><em>#Satış veri setinin ilk 5 gözlemi</em><br>df_satis.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1003/1*vv_DGIaGIgHV8W3olKqiow.png" /></figure><pre><em># df_satis HAKKINDA YAPISAL BİLGİLER : </em><br><em># Burada  Customer ID ve Price değişkenlerinin float tipinde olduğunu görüyorum. Kütüphane Ayarları bölümünde, float değişkenler için &quot;virgülden sonra 2 basamak gösterilsin&quot; ayarı yapmıştım.</em><br><em># Bu durum Customer ID yi de etkiledi. Yukarıda da &quot;Cutomer ID&quot; için virgülden sonra 2 basamak yazıldığını gözlemledim.</em><br><em># &quot;Customer ID&quot; aslında kategorik değişken olmalı. Bu değişkene tip dönüşümü uygulayacağım.</em></pre><pre>df_satis.info()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/729/1*M6kx1eEp4GP1UwmbhUFc0g.png" /></figure><pre><em># Customer ID TİP DÖNÜŞÜMÜ</em><br><em># Hem satış veri seti, hem de iade veri seti için bu dönüşümü uyguluyorum. </em><br><em># İlk önce integera çevirerek, virgülden sonraki basamaklardan kurtulacağım. Sonrasında string tipine dönüştürerek, kategorik değişken yapacağım.</em></pre><pre>df_satis[&quot;Customer ID&quot;] = df_satis[&quot;Customer ID&quot;].astype(int)<br>df_iade[&quot;Customer ID&quot;] = df_iade[&quot;Customer ID&quot;].astype(int)</pre><pre><em>#Hem satış veri setinde, hem de iade veri setinde &quot;Customer ID&quot; kolonunu kategorik değişkene çevirmek için string dönüşümü uyguluyorum.</em></pre><pre>df_satis[&quot;Customer ID&quot;] = df_satis[&quot;Customer ID&quot;].astype(str)<br>df_iade[&quot;Customer ID&quot;] = df_iade[&quot;Customer ID&quot;].astype(str)</pre><pre><em>#Satış veri setimin yapısal bilgilerine yeniden bakıyorum.</em><br><em>#Customer ID nin kategorik değişkene dönüştüğünü gözlemledim.(object type)</em></pre><pre>df_satis.info()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/721/1*SVNF7zn6MLmY2Vgib4DnjA.png" /></figure><pre><em>#Customer ID nin virgülden sonraki basamaklarının uçtuğunu gözlemliyorum. İşlemimiz başarılı.</em></pre><pre>df_satis.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1010/1*WJjSVlOHBbsR94fjyrqGBA.png" /></figure><h3>5). Veriyi Anlama</h3><pre><em>#Orjinal veri setinin boyut bilgisi</em><br>df_2010_2011.shape</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/723/1*tCGw1clpxFu6wo-A32y88g.png" /></figure><pre><em># Satış veri seti boyut bilgisi</em><br>df_satis.shape</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/1*DXBU0txMrXkwFoOjSoKEzQ.png" /></figure><pre><em># İade veri seti boyut bilgisi </em><br>df_iade.shape</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/727/1*fB3tvU8jkvxddjrBo2Fkbg.png" /></figure><pre><em># Satış ve İade veri setlerinden silinen NaN kayıtların toplamı</em><br>top_nan = satis_nan + iade_nan<br>top_nan</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/726/1*Wzn0KgyyWuU01MerdJX3FA.png" /></figure><p><strong>Yaptığım işlemleri doğrulamak için küçük matematiksel hesaplar:</strong></p><p>Orjinal Veri Seti = Satış Veri Seti + İade Veri Seti + Satış ve İade’den silinen NaN kayıt sayısı</p><ul><li><strong>df_2010_2011.shape[0] :</strong> Orjinal Veri Seti satır sayısı</li><li><strong>df_satis.shape[0] :</strong> Satış Veri Seti satır sayısı</li><li><strong>df_iade.shape[0] :</strong> İade Veri Seti satır sayısı</li><li><strong>top_nan :</strong> Satış ve İade’den silinen NaN kayıt sayısı</li></ul><pre><em># Yukarıda verilen tanımlara göre, ana toplamın tutup tutmadığı kontrolü yapılıyor.</em><br><em>#True döndüğü için verilerde bir kaybımız olmadı. Yaptığımız işlemleri veri sayısı bakımından doğrulamış olduk</em></pre><pre>df_2010_2011.shape[0] == df_satis.shape[0] + df_iade.shape[0] + top_nan</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/721/1*fv06W1gWE8Vg513aXm51DQ.png" /></figure><pre><em>#df_satis kolon isimleri</em></pre><pre>df_satis.columns</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/725/1*Cj1of3mgJk_qPq0LyERcfw.png" /></figure><pre><em># df_satis DEĞİŞKENLERİNİN İSTATİSTİKSEL BİLGİLERİ </em><br><em># Buraya sadece sayısal değişkenlerin bilgileri gelir.</em></pre><pre>df_satis.describe().T</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/554/1*HGAm5Zvkt7Y6refOU_rfwg.png" /></figure><pre><em>#Satış veri setindeki tüm satılan ürünlerin sayısı(Eşsiz ürün kodu toplamı)</em></pre><pre>df_satis[&quot;StockCode&quot;].nunique()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/724/1*AhNqrWlGFJ_ctcIVYYZNQQ.png" /></figure><pre><em>#İade Verisindeki tüm ürünlerin sayısı(Eşsiz ürün kodu toplamı)</em></pre><pre>df_iade[&quot;StockCode&quot;].nunique()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/730/1*3Wf3UsK1tEb1m5FK29unag.png" /></figure><pre><em>#Satış Verisinde hangi üründen kaçar tane var? İlk 5 gözlemi getir.</em></pre><pre>df_satis[&quot;StockCode&quot;].value_counts().head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/725/1*SYhsrvhs1hbsjLD3lriBVg.png" /></figure><pre><em>#Satış verisinde en çok sipariş edilen ürünler hangileri? İlk 5 gözlemi getir.</em></pre><pre>df_satis.groupby(&quot;StockCode&quot;).agg({&quot;Quantity&quot;:&quot;sum&quot;}).sort_values(&quot;Quantity&quot;, ascending = False).head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/186/1*vDU9SHCAKI9hCERg5JCaeA.png" /></figure><pre><em>#İade verisinde en çok iade edilen ürünler hangileri? İlk 5 gözlemi getir.</em><br><em>#Buradaki negatiflik, ürünün iade olduğu anlamına gelir. Vektörel bir anlam gibi düşünülebilir. </em><br><em># Sayısal olarak -1 büyük olmasına rağmen, miktarsal olarak bir büyüklük ifade etmeyeceğinden, satış verisindekinin aksine, &quot;ascending&quot; değerini burada &quot;True&quot; vererek, en çok iade alanı en başta görebiliriz.</em></pre><pre>df_iade.groupby(&quot;StockCode&quot;).agg({&quot;Quantity&quot;:&quot;sum&quot;}).sort_values(&quot;Quantity&quot;, ascending = True).head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/200/1*u9-vSb_0XmOROWO9FNPv_Q.png" /></figure><pre><em>#Satış veri setinde toplam kaç fatura kesilmiştir?</em></pre><pre>df_satis[&quot;Invoice&quot;].nunique()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/726/1*eTINtcdstid2VUNl6KuO5g.png" /></figure><pre><em>#Satış veri setinde her bir kayıt için toplam fiyat hesaplayalım ve yeni bir kolon olarak ekleyelim.</em></pre><pre>df_satis[&quot;TotalPrice&quot;] = df_satis[&quot;Quantity&quot;]*df_satis[&quot;Price&quot;]<br>df_satis.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zd1lf_87sUdp2CZupl59NA.png" /></figure><pre><em>#Satış veri setinde fatura başına ne kadar para kazanılmıştır? En fazla para kazanılan faturalar hangileridir? İlk 5 gözlemi getirelim.</em></pre><pre>df_satis.groupby(&quot;Invoice&quot;).agg({&quot;TotalPrice&quot;:&quot;sum&quot;}).sort_values(&quot;TotalPrice&quot;, ascending = False).head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/170/1*aFBHOo5zFvj5DSS9CiW9LA.png" /></figure><pre><em>#Satış veri setinde en pahalı ürünler hangileridir? İlk 5 gözlemi getirelim.</em></pre><pre>df_satis.sort_values(&quot;Price&quot;,ascending = False).head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/957/1*xtGj9b29M2COoF23hK0aEw.png" /></figure><pre><em>#Satış veri setinde hangi ülkeden kaç sipariş geldi?</em></pre><pre>df_satis.groupby(&quot;Country&quot;).agg({&quot;Quantity&quot;:&quot;sum&quot;}).sort_values(&quot;Quantity&quot;,ascending = False)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/182/1*cWVdBz6EblCNj2PAeAoLjw.png" /></figure><pre><em>#Satış veri setindeki, ülkelerden alınan maximum sipariş miktarlı ürün kodlarını, Ülke, Ürün Kodu ve Miktar bazında alalım</em></pre><pre>df_sonuc = df_satis.groupby([&quot;Country&quot;,&quot;StockCode&quot;]).agg({&quot;Quantity&quot;:&quot;sum&quot;}).sort_values(&quot;Quantity&quot;, ascending = False)<br>df_sonuc = df_sonuc.reset_index()<br>df_sonuc.groupby(&quot;Country&quot;).head(1)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/266/1*tnUcpq70jso5f_t3gDQx4w.png" /></figure><pre><em>#Satış veri setinde hangi ülke ne kadar kazandırdı?</em></pre><pre>df_satis.groupby(&quot;Country&quot;).agg({&quot;TotalPrice&quot;:&quot;sum&quot;}).sort_values(&quot;TotalPrice&quot;,ascending = False)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/186/1*-iHjw7CyTzuvcZSt8zOoRw.png" /></figure><pre><em>#Satış veri setinin istatistiksel bilgilerini daha detaylı gözlemleyelim.</em></pre><pre>df_satis.describe([0.01,0.05,0.10,0.25,0.50,0.75,0.90,0.95, 0.99]).T</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/760/1*o1SEpKSkSkmO39Ml924GDw.png" /></figure><h3>6). RFM Skorları ile Müşteri Segmentasyonu</h3><ul><li><strong>Recency Değeri Hesaplama İşlemleri<br>Recency, </strong>Müşterinin son temasından bugüne kadar geçen süredir.</li></ul><pre><em>#Veri seti eski tarihli bir veri seti olduğu için, müşterilerin son temasından bugüne kadar olan süreyi hesaplarsak, bu süre çok uzun olacaktır.</em><br><em>#Biz kendimize örnek olması açısından, veri seti üzerinden bir &quot;bugün&quot; belirleyelim. Bunu da veri seti üzerindeki en son tarihli gün olarak alalım.</em></pre><pre>max_date = df_satis[&quot;InvoiceDate&quot;].max()<br>max_date</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/725/1*26cvcyh6zZjhLjm55B-ggA.png" /></figure><pre><em>#max_date değişkenini datetime tipi olarak almalıyız. Böylece günler arasında çıkartma işlemini yapabileceğiz.</em><br>import datetime as dt</pre><pre>bugün = dt.datetime(2011,12,9,12,50,0)<br>bugün</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/725/1*EJx0G0q7iXcY4g-2CPXxwg.png" /></figure><pre><em>#Bugünün tarihinden, müşterilerin son alışveriş tarihlerini çıkartarak arada geçen sürenin gün değerlerini yeni bir dataframe yapısına atalım. Bu değeler müşterinin &quot;Recency&quot; değerleridir. İlk 5 gözleme bakalım</em></pre><pre>df_tempr = (bugün - df_satis.groupby(&quot;Customer ID&quot;).agg({&quot;InvoiceDate&quot;:&quot;max&quot;})).rename(columns={&quot;InvoiceDate&quot;:&quot;Recency&quot;})[&quot;Recency&quot;].apply(lambda x : x.days)<br>df_recency = pd.DataFrame(df_tempr)<br>df_recency.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/167/1*0oDYH7kS-0ykDBKJ4ug9DA.png" /></figure><ul><li><strong>Frequency Değeri Hesaplama İşlemleri<br>Frequency, </strong>müşterinin toplam satın alma sayısıdır.</li></ul><pre><em># Her bir müşteriye kesilmiş farklı fatura sayılarını bulursak, müşterinin toplam satın alma sayısını bulmuş oluruz. Bu da frequency değerimizdir.</em></pre><pre><em>#İlk önce Müşteri ID ve Fatura No bazında gruplayarak, her bir faturanın Müşteri bazında kaç sefer çoklandığını gözlemliyoruz.İlk 5 gözleme bakalım</em></pre><pre>df_tempf = df_satis.groupby([&quot;Customer ID&quot;,&quot;Invoice&quot;]).agg({&quot;Invoice&quot;:&quot;count&quot;})<br>df_tempf.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/227/1*WBDclBIHHtZ51UZ9jdakSA.png" /></figure><pre><em>#Şimdi de df_tempf üzerinde her bir müşterideki fatura sayısını saydırmamız lazım. Bulduğumuz değerler, müşterilerin &quot;Frequency&quot; değerleridir. İlk 5 gözleme bakalım</em></pre><pre>df_frequency = df_tempf.groupby(&quot;Customer ID&quot;).agg({&quot;Invoice&quot;:&quot;count&quot;}).rename(columns = {&quot;Invoice&quot;:&quot;Frequency&quot;})<br>df_frequency.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/181/1*uh-V-FWNguYeMVgqWSoYGQ.png" /></figure><ul><li><strong>Monetary Değeri Hesaplama İşlemleri<br>Monetary, </strong>müşterinin yaptığı toplam harcamadır.</li></ul><pre><em>#Her bir müşterinin daha önce hesaplamış olduğumuz TotalPrice değerlerinin toplamı, bize o müşterinin yaptığı toplam harcamayı yani &quot;Monetary&quot; değerini verir. İlk 5 gözlemine bakalım</em></pre><pre>df_monetary = df_satis.groupby(&quot;Customer ID&quot;).agg({&quot;TotalPrice&quot;:&quot;sum&quot;}).rename(columns = {&quot;TotalPrice&quot;:&quot;Monetary&quot;})<br>df_monetary.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/182/1*7_vGyqe7KLBdTFiz5DeSfA.png" /></figure><p><strong>Müşteri Bazlı Bulunan RFM Skorlarının Birleştirilmesi</strong></p><pre><em>#Concatenate işleminin düzgün yapılabilmesi için satır ve sütun sayılarında, işlemi bozacak bir uyumsuzluk olmadığı kontrolü sağlanır. Tüm RFM dfleri aynı boyuta sahiptir.</em><br>print(df_recency.shape, df_frequency.shape, df_monetary.shape)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/728/1*gUHLrcFWHbEChMf22i2gdQ.png" /></figure><pre><em>#Tüm RFM skorlarını tek bir dataframede toplayıp ismine &quot;df_rfm&quot; diyelim</em></pre><pre>df_rfm = pd.concat([df_recency,df_frequency,df_monetary], axis = 1)<br>df_rfm.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/335/1*pRJYkRDFkxQ6yJOsZSioyQ.png" /></figure><pre><em>#RFM Skorlarını 1 den 5 e kadar puanlayacağım.</em></pre><pre>birden_bese = [&#39;1&#39;,&#39;2&#39;,&#39;3&#39;,&#39;4&#39;,&#39;5&#39;]<br>besten_bire = [&#39;5&#39;,&#39;4&#39;,&#39;3&#39;,&#39;2&#39;,&#39;1&#39;]</pre><pre><em>#Frequency : Müşterinin toplam satın alma sayısı -&gt; değerinin yüksek olması, puanın yüksek olması anlamına gelir.</em><br><em>#Bu nedenle doğru bir orantı vardır. 1 den 5 e puanladım. Her sınıfın sayılarına baktım</em></pre><pre>cut_bins = [0,1,2,4,10,210]<br>df_rfm[&quot;FrequencyScore&quot;] = pd.cut(df_rfm[&quot;Frequency&quot;], bins = cut_bins, labels = birden_bese)<br>df_rfm[&quot;FrequencyScore&quot;].value_counts()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/723/1*HNX5eJmiVbMDbGvwdtaU1Q.png" /></figure><pre><em>#Recency : Müşterinin son temasından bugüne kadar geçen süre -&gt; değerin yüksek olması, puanın düşük olması anlamına gelir.</em><br><em>#Bu nedenle ters bir orantı vardır. 5&#39;ten 1&#39;e puanladım. Her sınıfın sayılarına baktım</em></pre><pre>df_rfm[&quot;RecencyScore&quot;] = pd.qcut(df_rfm[&#39;Recency&#39;], 5, labels = besten_bire)<br>df_rfm[&quot;RecencyScore&quot;].value_counts()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/724/1*4uM4g69tmYYJtkyAX9TWRQ.png" /></figure><pre><em>#Monetary : Müşterinin yaptığı toplam harcama -&gt; değerin yüksek olması, puanın yüksek olması anlamına gelir.</em><br><em>#Bu nedenle doğru bir orantı vardır. 1 den 5 e puanladım. İlk 5 gözlemi aldım. Her sınıfın sayılarına baktım</em></pre><pre>df_rfm[&quot;MonetaryScore&quot;] = pd.qcut(df_rfm[&#39;Monetary&#39;], 5, labels = birden_bese)<br>df_rfm[&quot;MonetaryScore&quot;].value_counts()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/721/1*ZaA6DTqDUCwFsfaBjZ3kag.png" /></figure><pre><em>#RFM skorunun müşteri bazında birleştirilmiş halini RFM_SCORE olarak dataframe yapımıza ekleyelim. İlk 5 gözlemi alalım.</em></pre><pre>df_rfm[&quot;RFM_SCORE&quot;] = df_rfm[&#39;RecencyScore&#39;].astype(str) + df_rfm[&#39;FrequencyScore&#39;].astype(str) + df_rfm[&#39;MonetaryScore&#39;].astype(str)<br>df_rfm.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/743/1*50is0g5QNLzaIrUjxKNfjw.png" /></figure><pre><em>#En Yüksek RFM_SCORE a sahip ilk 5 müşteri</em></pre><pre>df_rfm[df_rfm[&quot;RFM_SCORE&quot;]==&#39;555&#39;].head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/738/1*6NXMSy-0lUW-s1CAKaXnng.png" /></figure><pre><em>#En Düşük RFM_SCORE a sahip ilk 5 müşteri</em></pre><pre>df_rfm[df_rfm[&quot;RFM_SCORE&quot;]==&#39;111&#39;].head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/1*qQxScsPioyQvytGT-7l9YQ.png" /></figure><pre><em>#RFM skorlarının istatistiksel değerlerine bakalım</em></pre><pre>df_rfm.describe().T</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/552/1*3ob9kplrNHHCv53aImHhGg.png" /></figure><p><strong>Müşteri Segmentasyonu</strong></p><p>Müşterilerimi “Recency” ve “Frequency” değerlerini kullanarak segmentlere ayıracağım :</p><pre><em>#Recency ve Frequency Skorlarına göre Müşteri Segmentlerine isim verebilmek için regular expression (regex) yapısı kuruyorum.</em></pre><pre>seg_map = {<br>    r&#39;[1-2][1-2]&#39;: &#39;Hibernating&#39;,<br>    r&#39;[1-2][3-4]&#39;: &#39;At Risk&#39;,<br>    r&#39;[1-2]5&#39;: &#39;Can<strong>\&#39;</strong>t Loose&#39;,<br>    r&#39;3[1-2]&#39;: &#39;About to Sleep&#39;,<br>    r&#39;33&#39;: &#39;Need Attention&#39;,<br>    r&#39;[3-4][4-5]&#39;: &#39;Loyal Customers&#39;,<br>    r&#39;41&#39;: &#39;Promising&#39;,<br>    r&#39;51&#39;: &#39;New Customers&#39;,<br>    r&#39;[4-5][2-3]&#39;: &#39;Potential Loyalists&#39;,<br>    r&#39;5[4-5]&#39;: &#39;Champions&#39;<br>}</pre><pre><em>#Regex yapısını kullanarak müşterilerimi segmentlere ayırıyorum ve bulundukları segmentleri &quot;Segmet&quot; kolonunda gösteriyorum. İlk 5 gözleme bakalım</em></pre><pre>df_rfm[&#39;Segment&#39;] = df_rfm[&#39;RecencyScore&#39;].astype(str) + df_rfm[&#39;FrequencyScore&#39;].astype(str)<br>df_rfm[&#39;Segment&#39;] = df_rfm[&#39;Segment&#39;].replace(seg_map, regex=True)<br>df_rfm.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/839/1*WycDQ9vm9GnomCuUY6Ol5w.png" /></figure><pre><em>#&quot;Need Attention&quot; sınıfına ait customer ID&#39;leri seçerek excel çıktısı almak istiyorum. İlk 5 gözleme bakıyorum.</em></pre><pre>need_attention_df = pd.DataFrame()<br>need_attention_df[&quot;NeedAttentionCustomerID&quot;]= df_rfm[df_rfm[&quot;Segment&quot;]==&#39;Need Attention&#39;].index<br>need_attention_df.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/217/1*LJBw4FpyabjVI3PjqVwDdw.png" /></figure><pre><em>#Excele alıyorum</em></pre><pre>need_attention_df.to_csv(&quot;Need_Attention.csv&quot;)</pre><p>Bu işlemden sonra, bulunduğumuz dizinde “Need_Attention.csv” isimli csv dosyasının oluşmasını bekliyorum.</p><h3>7). Yorumlar</h3><pre><em>#Her bir RFM grubunun ortalama ve adet değerlerini görmek istiyorum.</em></pre><pre>df_rfm[[&quot;Segment&quot;, &quot;Recency&quot;,&quot;Frequency&quot;,&quot;Monetary&quot;]].groupby(&quot;Segment&quot;).agg([&quot;mean&quot;,&quot;count&quot;])</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/452/1*nzwzu7H3hSmts7TbttuIQQ.png" /></figure><p><strong>3 müşteri segmenti seçiyorum :</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/617/1*dpasVs92Sx_0e2ET3tlbjQ.png" /></figure><p><strong>1). Can’t Loose Them</strong></p><ul><li>Bu grupta 12 kişi vardır.</li><li>Ortalama 136.33 gündür alışveriş yapmıyorlar.</li><li>Ortalama 14.92 kez alışveriş yapmışlar.</li><li>Ortalama 4150.68 Birim para kazandırmışlar.</li></ul><p><strong>Alınabilecek Aksiyon Kararı :</strong> Bu grup uzun zamandır alışveriş yapmıyor fakat toplam satın alma sayıları oldukça yüksektir. Yani firmadan alışveriş yapmaya meyilli bir gruptur. Sadece firma olarak kendimizi kısaca bir hatırlatmalıyız :) Bunun için, son yaptıkları alışverişlere bakılarak, kendilerini uzun zamandır aramızda görmediğimizi bildirmeli ve ilgilenebilecekleri ürünler üzerinden indirim kampanyaları düzenleyerek alışveriş yapmalarını sağlayabiliriz.</p><p><strong>2). Need Attention</strong></p><ul><li>Bu grupta 208 kişi vardır.</li><li>Ortalama 50.93 gündür alışveriş yapmıyorlar.</li><li>Ortalama 3.43 kez alışveriş yapmışlar</li><li>Ortalama 1339.38 Birim para kazandırmışlar.</li></ul><p><strong>Alınabilecek Aksiyon Kararı :</strong> Bu grup hem zamansal olarak hem de toplam satın alma sayıları olarak ortalama değerler göstererek kaybetmeye meyilli olduğumuz, aynı zamanda da kazanmak için aşırı çaba gerektirmeyen müşteri grubudur. Hem satın alma sayılarını, hem de firmamızla temaslarını arttırmalıyız. “Loyal Customers” dediğimiz sadık müşterilerimize yakın bir gruptur. Kendilerini bu gruba çekmek için Frequency değerlerini arttırmalıyız, yani yukarıdaki görsele göre dikeyde bir hareket yaptırmalıyız Küçük meblağlı alışverişler dahi olsa toplam satın alma sayılarını arttırabilecek ve ilgilerini çekebilecek ürün tanıtımları veya promosyonlarla kendilerini sadık müşteri grubuna transfer edebiliriz.</p><p><strong>3). New Customers</strong></p><ul><li>Bu grupta 67 kişi vardır.</li><li>Ortalama 6.09 gündür alışveriş yapmıyorlar.</li><li>Ortalama 1 kez alışveriş yapmışlar</li><li>Ortalama 348.64 birim para kazandırmışlar.</li></ul><p><strong>Alınabilecek Aksiyon Kararı :</strong> Bu müşteri grubu, son temasları taze olan gruptur. Dolayısı ile bu grubun yukarıdaki görsele göre dikeyde hareket etmelerini sağlamalıyız. İlk önce “Potential Loyalists” grubuna, daha sonra da “Loyal Customers” grubuna dahil olmalarını sağlayacak 2 adım attırmalıyız. Bunun için toplam satın almalarını arttırmalıyız. Küçük meblağlarla dahi olsa bize sık sık gelmelerini sağlamalıyız. Yeni müşterilere özel kampanyalar düzenleyerek, bir sonraki hafta veya bir sonraki ay gelecek olan ürün tanıtımlarını yaptıktan sonra, yeni müşterilere özel kampanyalarla harmanlayarak, toplam satın alma sayılarını arttırabiliriz.</p><p>Bir önceki yazımda “<strong>Apriori Algoritması ile Birliktelik Analizi ve Tavsiye Sistemi Geliştirme”</strong> konusunu ele almıştım. <a href="https://medium.com/@baharkyn/apriori-algoritmas%C4%B1-ile-birliktelik-analizi-ve-tavsiye-sistemi-geli%C5%9Ftirme-4ca8a720cd77"><strong>Bu linkten</strong></a><strong> </strong>erişebilirsiniz.</p><p>Bir sonraki yazımda görüşmek üzere,</p><p>Sevgiyle kalın.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=29dfcd6c7934" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Medium İle Nasıl Tanıştım?]]></title>
            <link>https://medium.com/@baharkyn/medium-i%CC%87le-nas%C4%B1l-tan%C4%B1%C5%9Ft%C4%B1m-e533402330ec?source=rss-e433c790981f------2</link>
            <guid isPermaLink="false">https://medium.com/p/e533402330ec</guid>
            <category><![CDATA[hello-medium]]></category>
            <dc:creator><![CDATA[Bahar Kayan]]></dc:creator>
            <pubDate>Sun, 21 Jun 2020 22:17:13 GMT</pubDate>
            <atom:updated>2020-06-22T12:32:58.538Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hgSsynpD4yU8mtPVU5ii-g.png" /></figure><p>Herkese merhaba !</p><p>Medium platformu ile buluşmamın ilk yazısına kısaca kendimden bahsederek ve bu platforma nasıl giriş yaptığımı anlatarak başlamak istedim. :) Isınma turları olsun ;)</p><p>Kurumsal bir firmada IT Departmanında yazılım geliştirerek hayatını idame ettiren Bahar, Veri Bilimi dünyasına herhangi bir dış etki olmadan, içten yanmalı merak duygusu ile giriş yapmıştır :) 1 Mayıs 2020 tarihinden beri aktif olarak bu alanda araştırmalar yaparak kendini geliştirmektedir. Bugün 21 Haziran 2020 olduğunu düşünürsek, epey yeni olduğunu söyleyebiliriz :)<br>Burası benim için günlük gibi olsun istiyorum, tarihler veriyorum ki geçmişe dönüp baktığımda benim için de bir anı niteliğinde olabilsin :)</p><p>Kendimi iyi hissettiren ilk projemi yaptıktan sonra, bunu paylaşma, bir yerlere kaydetme ihtiyacı hissettim. Bu amaçla “<strong>Data Science &amp; Machine Learning Bootcamp</strong>”ın değerli eğitmeni <a href="https://www.linkedin.com/in/mvahitkeskin/"><strong>M.Vahit Keskin</strong></a> önerisi ile Medium ile tanıştım ve buradayım!</p><p>Sözü çok fazla uzatmadan çalışmamdan bahsetmek istiyorum. Veri Bilimi dünyasında Association Rule dediğimiz Birliktelik Analizini Apriori Algoritması ile uyguladım ve 7 aşamada geliştirmiş olduğum Tavsiye Sistemini sizlerle paylaştığım “<a href="https://medium.com/@baharkyn/apriori-algoritmas%C4%B1-ile-birliktelik-analizi-ve-tavsiye-sistemi-geli%C5%9Ftirme-4ca8a720cd77"><strong>Apriori Algoritması ile Birliktelik Analizi ve Tavsiye Sistemi Geliştirme</strong></a>” başlıklı yazımda görüşmek üzere!</p><p>Sevgiyle kalın!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e533402330ec" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tavsiye Sistemleri]]></title>
            <link>https://medium.com/@baharkyn/apriori-algoritmas%C4%B1-ile-birliktelik-analizi-ve-tavsiye-sistemi-geli%C5%9Ftirme-4ca8a720cd77?source=rss-e433c790981f------2</link>
            <guid isPermaLink="false">https://medium.com/p/4ca8a720cd77</guid>
            <category><![CDATA[recommendation-system]]></category>
            <category><![CDATA[association-rule]]></category>
            <category><![CDATA[apriori-algorithm]]></category>
            <dc:creator><![CDATA[Bahar Kayan]]></dc:creator>
            <pubDate>Sun, 21 Jun 2020 22:07:16 GMT</pubDate>
            <atom:updated>2020-06-30T17:02:45.315Z</atom:updated>
            <content:encoded><![CDATA[<h3>Apriori Algoritması ile Birliktelik Analizi ve Tavsiye Sistemi Geliştirme</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/625/1*5-WbYgH-RtnrcZXRaTgNpg.png" /></figure><p>Değerli okurlar merhaba!</p><p>Sizlere marketten aynı anda alınan ürünleri içeren veri seti üzerinden, Support ve Confidence değerlerini yorumlayarak 7 adımda basit tavsiye sistemi geliştirip, aksiyon fikri önereceğim. Geliştirmeler <strong>JupyterLab</strong> üzerinde <strong>Python</strong> ile yapılmıştır.Ayrıca <strong>Kaggle</strong> platformunda paylaşılmış olup notebook olarak kaydedilmiştir. Dilerseniz aşağıdaki linkten notebook detayına da erişebilirsiniz :<br><a href="https://www.kaggle.com/baharkayan/apriori-association-rule"><em>https://www.kaggle.com/baharkayan/apriori-association-rule</em></a></p><p>Öncelikle çalışmanın sonunda yorum için kullanacağımız 2 değerden bahsetmek istiyorum:</p><p><strong>X:</strong> ürün <strong>Y:</strong> ürün <strong>N:</strong> toplam alışveriş</p><ul><li><strong>Destek (Support): </strong>X ve Y nin birlikte görülme olasılığı<br>Support(X, Y) = Freq(X,Y)/N</li><li><strong>Güven (Confidence): </strong>X alanların yüzde şu kadarı Y yi de alacak<br>Confidence(X, Y) = Freq(X,Y) / Freq(X)</li></ul><p>Yukarıda bahsettiğim 7 adım ile geliştirmiş olduğum Tavsiye Sistemi adımlarına geçelim :</p><h4><strong>1). Veri Okuma</strong></h4><pre><em>#https://www.kaggle.com/shazadudwadia/supermarket linkindeki dataseti notebookuma dahil ettim. Ardından CSV okuma işlemini gerçekleştiriyorum.</em></pre><pre>import pandas as pd<br>df = pd.read_csv(&#39;../input/supermarket/GroceryStoreDataSet.csv&#39;, names=[&#39;products&#39;], header=None)<br>df</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/299/1*G3jEGv8cjyIcKDqzeCY70Q.png" /></figure><pre><em>#DataFrame içerindeki verileri merak ettim, verileri çekiyorum.</em></pre><pre>df.values</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/493/1*KITMi3fvEHhvMzDY3d6mJw.png" /></figure><pre><em>#Satır ve Sütun bilgisini merak ettim, boyut bilgisine erişiyorum.</em></pre><pre>df.shape</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/490/1*6ahbA1NmRTghzoAEvJ35ow.png" /></figure><h4><strong>2). Veri Hazırlama</strong></h4><p>Birliktelik analizinin yapılabilmesi için <strong>Apriori</strong> algoritmasını kullanacağım.</p><p><strong>mlxtend</strong> kütüphanesinin <strong>apriori</strong> metodu, veri setini <strong>True-False</strong> dataframe olarak kabul etmektedir. Veriyi dönüştürmek için yine <strong>mlxtend</strong> kütüphanesinin veriyi dönüştürme metodlarını kullanacağım. Bu nedenle elimdeki ham veri setini, bu metodların isteyeceği formata dönüştüreceğim.</p><pre><em>#Adım1 : Veriyi liste formatına dönüştürdüm. Her bir satırdaki objeleri &#39;,&#39; ile ayırdım.</em></pre><pre>data = list(df[&quot;products&quot;].apply(lambda x : x.split(&#39;,&#39;)))<br>data</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/489/1*jivPEkhRmSqQCT73oZ13nw.png" /></figure><pre><em>#Adım2 : mlxtend kütüphanesinin veriyi True-False dataframe ine dönüştürme metodunu uyguluyacağım. İlk önce, kurulu olmayanlar için mlxtend kütüphanesini install ediyorum.</em></pre><pre>!pip install mlxtend</pre><pre>from mlxtend.preprocessing import TransactionEncoder<br>te = TransactionEncoder()<br>te_data = te.fit(data).transform(data)<br>df = pd.DataFrame(te_data,columns=te.columns_)<br>df</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/638/1*L9WlZX6pYFsgJPG-bjZn7A.png" /><figcaption>mlxtend kütüphanesi bende daha önceden kurulu olduğu için “already satisfied” çıktılarını aldım.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/798/1*qWSDdVvCaPDGEa6dOJMYaA.png" /></figure><h4>3). Apriori Algoritmasını Uygulama</h4><p>Apriori algoritmasının çıktısında, her bir kombinasyonun, tüm veri setindeki frekanslarını elde etmiş oluruz. Örneğin aşağıdaki çıktıda sadece “BISCUIT” in tüm veri setinde görülme sıklığı(frekans) 0.35 iken, “BISCUIT ve BREAD” in tüm veri setinde birlikte görülme sıklığı(frekans) 0.20 dir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/540/1*N4T6GOfd7_AIOonz_4pXQA.png" /></figure><pre><em># Apriori algoritmasına min_support değeri 0.2 verildi. Böylece kombinasyonlardaki 0.2 support değerinin altında olan ürün birliktelikleri elenmiş oldu.<br># &quot;verbose&quot; argümanının 1 olması ise toplam kaç kombinasyon olduğu bilgisini bize verecektir. Örneğimizde 42 kombinasyon oluşmuştur. <br># En son durumda ise elimizde 16 kombinasyon kalmıştır. <br># Demek ki 42-16 = 26 kombinasyonumuz 0.2 support değerinin altında kalmış ve yorumlarımıza katmayacağımız önemsiz bir oran olarak ele alınmıştır.</em></pre><pre>from mlxtend.frequent_patterns import apriori<br>freq_items = apriori(df,min_support=0.20,use_colnames = True, verbose = 1)<br>freq_items</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/493/1*YyP3StH4W3OlcI2AYUD3Tg.png" /></figure><h4>4). Birliktelik Analizi Uygulama :</h4><p><strong>mlxtend</strong> kütüphanesinin <strong>association_rules</strong> metodu ile support değerleri elimizde olan veri seti kombinasyonuna birliktelik analizi uygulayacağım. Son çıktımı “support” ve “confidence” değerlerine göre yorumlayıp örnek bir aksiyon fikri önereceğim.</p><p><strong>Örnek Birliktelik Analizi Çıktısı Yorumlama :</strong></p><ul><li>BISCUIT ve BREAD in birlikte görülme olasılığı <strong>support = 0.20</strong> olduğundan <strong>%20</strong> dir.</li><li>BISCUIT alındığında BREAD alınma olasılığı ise <strong>confidence = 0.571429</strong> olduğundan <strong>%57</strong> civarıdır.</li></ul><pre><em># &quot;min_threshold = 0.3&quot; verilerek, &quot;confidence&quot; değeri 0.3 altında olan değerlerin getirilmemesi tercih olarak sağlandı.</em></pre><pre>from mlxtend.frequent_patterns import association_rules<br>df_res = association_rules(freq_items, metric = &quot;confidence&quot;, min_threshold = 0.3)<br>df_res</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/923/1*R2YgCqs_zlH2WrcrpAbOCg.png" /></figure><h4>5). Veri Filtreleme için Hazırlık</h4><p>Bu kısımda en düşük ve en yüksek confidence değerleri alınarak, bu değerler veri filtrelemede kullanılacak ve aksiyon fikri önerilecektir.</p><pre><em>#En yüksek confidence değerini bulalım. Çıktıda en yüksek confidence değerinin 0.80 olduğu görülüyor.</em></pre><pre>conf_max = df_res[&#39;confidence&#39;].max()<br>conf_max</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/493/1*kQysVSgwyd4LO6kBWx5Ihw.png" /></figure><pre><em>#En düşük confidence değerini bulalım. Çıktıda en düşük confidence değerinin 0.307 olduğu görülüyor.</em></pre><pre>conf_min = df_res[&quot;confidence&quot;].min()<br>conf_min</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/490/1*kbLJfUPtlTYHTTVt2lxeuw.png" /></figure><h4>6). Veri Filtreleme</h4><pre><em>#En düşük, En yüksek ve 0.5 confidence değerine sahip olan veriler filtreleniyor. &quot;confidence&quot; değerine göre artan sırada sıralanıyor.</em></pre><pre>df_filt = df_res[ (df_res[&quot;confidence&quot;] == conf_min) | (df_res[&quot;confidence&quot;] == conf_max) | (df_res[&quot;confidence&quot;] == 0.5 )]<br>df_filt.sort_values(&quot;confidence&quot;, ascending = True)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/975/1*yK1nt6LdSTiPn6maS_eT4g.png" /></figure><h4>7). Yorumlar ve Aksiyon Önerisi</h4><ul><li><strong>MILK :</strong> Süt</li><li><strong>BREAD :</strong> Ekmek</li><li><strong>COFFEE :</strong> Kahve</li><li><strong>CORNFLAKES :</strong> Mısır Gevreği</li><li><strong>BISCUIT :</strong> Bisküvi</li></ul><p><strong>Yukarıdaki çıktı baz alındığında;</strong></p><p><strong>Index = 0 için :</strong><br><strong>a).</strong> Ekmek ve Bisküvinin birlikte alınma olasılığı <strong>support = 0.2</strong> olduğu için <strong>%20</strong>&#39;dir.<br><strong>b).</strong> Ekmek alındığında Bisküvi alınma olasılığı <strong>confidence = 0.307692</strong> olduğu için <strong>%30</strong>&#39;dur.<br><strong>c).</strong> Bisküvinin tek başına alınma olasılığı <strong>consequent support = 0.35</strong> olduğu için <strong>%35</strong>&#39;tir.</p><p><strong>Index = 9 için :</strong><br><strong>a).</strong> Kahve ve Mısır Gevreğinin birlikte alınma olasılığı <strong>support = 0.2</strong> olduğu için <strong>%20</strong>&#39;dir.<br><strong>b).</strong> Kahve alındığında Mısır Gevreği alınma olasılığı <strong>confidence = 0.5</strong> olduğu için <strong>%50</strong>&#39;dir.</p><p><strong>Index = 3 için :</strong><br><strong>a).</strong> Süt ve Ekmeğin birlikte alınma olasılığı <strong>support = 0.2</strong> olduğu için <strong>%20</strong>&#39;dir.<br><strong>b).</strong> Süt alındığında Ekmek alınma olasılığı <strong>confidence = 0.8</strong> olduğu için <strong>%80</strong>&#39;dir.</p><h3>Yorumlar :</h3><ul><li>Ekmek alan müşterilerin %30&#39;u Bisküvi de almaktadır.</li><li>Kahve alınan satışların yarısında Mısır Gevreği de alınmıştır.</li><li>Süt ve Ekmek tüm alışverişlerin %20 sinde birlikte alınmıştır.</li></ul><h3>Aksiyon Önerisi :</h3><ul><li>Süt alan müşterilerin ekmek alma olasılığı oldukça yüksektir(%80). Bu demek oluyor ki; süt alan müşteriler genelde ekmek de almaktadır ve muhtemelen süt aldıktan sonra ekmek reyonunun yolunu tutacaktır. Süt ve ekmek reyonları market içerisinde birbirinden uzak lokasyonlara konumlandırılarak, süt alan müşterinin ekmek reyonuna giderken, pek çok reyon geçmesi zorunlu kılınabilir. Böylece müşterinin yolculuğu sırasında herhangi bir ürün satın alma olasılığı arttırılabilir.</li><li>Ekmek alan müşterilerin Bisküvi alma olasılığı biraz düşük görünüyor(%30). Bisküvinin tek başına alınma olasılığı da düşük görünüyor(%35). Bisküvi satışını arttırmak için, ekmek rafının hemen yanına bisküvi standı konularak ve fiyatı ucuz olanlar ön plana yerleştirilip, fiyatı koyu etiketle basılarak müşterinin dikkatinin çekilmesi sağlanabilir.</li></ul><p><strong>Katkılarından dolayı teşekkürler! :</strong></p><ul><li><strong>M. Vahit Keskin :</strong> <br><a href="https://www.linkedin.com/in/mvahitkeskin/">https://www.linkedin.com/in/mvahitkeskin/</a></li><li><strong>Veri Bilimi Okulu:<br></strong><a href="https://www.linkedin.com/in/veribilimiokulu/">https://www.linkedin.com/in/veribilimiokulu/</a></li><li><strong>Referans Notebook:</strong><br><a href="https://www.kaggle.com/mariekaram/apriori-association-rule">https://www.kaggle.com/mariekaram/apriori-association-rule</a></li></ul><p>Bir sonraki yazımda “<strong>RFM Analizi ile Müşteri Segmentasyonu</strong>” konusunu ele alacağım. <a href="https://medium.com/@baharkyn/rfm-analizi-ile-m%C3%BC%C5%9Fteri-segmentasyonu-29dfcd6c7934"><strong>Bu linkten</strong></a> erişebilirsiniz.</p><p>Sevgiyle kalın!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4ca8a720cd77" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>