# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# + [markdown] id="view-in-github" colab_type="text"
# <a href="https://colab.research.google.com/github/pattom72/Projekt-UE/blob/master/DS_projekt_pawel_tometczak_final.ipynb" target="_parent"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/></a>

# + [markdown] id="l9aCgUyFm4Cl" colab_type="text"
# ![alt text](https://drive.google.com/uc?id=1SMxU6VSM8zIwEIzMaMTztlqBdMjdei4Q)

# + [markdown] id="gpluge9Wm4Co" colab_type="text"
# ### Projekt zaliczeniowy.
#
# Uniwersytet Ekonomiczny we Wrocławiu.
# DATA SCIENCE - Zaawansowana analiza danych.
#
# I semestr.
#
# $Pawel~Tometczak$
#

# + [markdown] id="KLQOxdiom4Cq" colab_type="text"
# W projekcie przeanalizowano dane dotyczące przedsiębiorstwa $XXX$ sprzedajacego produkty różnego rodzaju. Poddano analizie wartość dokonanych zakupów w kolejnych latach - podział na płeć, sprzedaż w kontekście analizy zarówno ilościowej, jak i jakościowej, a także popularność miast sprzedaży i poszczególne produkty, pod kątem ich udziału zarówno w wielkości sprzedaży, jak i w przychodach przedsiębiorstwa. Określono sezonowość sprzedaż w poszczególnych latach w rozłożeniu na miesiące.

# + [markdown] id="i678W-rjm4Cs" colab_type="text"
# Zaczynamy od wczytania potrzebnych pakietów i bibliotek:

# + id="YD6FZRk9m4Cu" colab_type="code" colab={}
import pandas as pd
import numpy as np
import seaborn as sns
import scipy.stats
from scipy.stats import kstest
from scipy import stats
from scipy.stats import skew
import random
import matplotlib.pyplot as plt
# %matplotlib inline

#from google.colab import files
#uploaded = files.upload()

# + [markdown] id="23cxXjnum4Cz" colab_type="text"
# Zmieniam precyzję wyświetlania liczb zmiennoprzecinkowych, liczby będą wyświetlane w Pandas z precyzją do trzech miejsc po przecinku:

# + id="CEOOc2Pjm4C1" colab_type="code" colab={}
pd.set_option('float_format', '{:.3f}'.format)

# + [markdown] id="uOAYzh_Jm4C5" colab_type="text"
# ### Wczytanie danych i oczyszczenie, normalizacja tabel dla wygodniejszej dalszej pracy:

# + id="-23S3nOgm4C7" colab_type="code" colab={}
products_raw = pd.read_csv("products.txt", sep='\t', engine='python', index_col = 'PRODUCTID')
products_raw.columns = products_raw.columns.str.lower()
products_raw.index.name = products_raw.index.name.lower()
    
customers_raw = pd.read_csv("customers.txt", sep='\t', engine='python', index_col = 'customerid')

orders_raw = pd.read_csv("orders.txt", encoding='cp1251', sep='\t', engine='python')
orders_raw.orderdate = pd.to_datetime(orders_raw.orderdate)

orderlines_raw = pd.read_csv("orderlines.txt",delimiter="\t", encoding="cp1251",  index_col='orderlineid')
orderlines_raw.shipdate = pd.to_datetime(orderlines_raw.shipdate)
orderlines_raw.billdate = pd.to_datetime(orderlines_raw.billdate)
orderlines_raw['year'] = orderlines_raw.shipdate.dt.year

#dane dodatkowe do analizy dużej bazy (littleBigData) - TABELE
calendar_raw_bd = pd.read_csv("calendar.txt", encoding='cp1251', sep='\t',low_memory=False)
campaigns_raw_bd = pd.read_csv("campaigns.txt", encoding='cp1251', sep='\t',low_memory=False)
zip1_raw_bd = pd.read_csv("ZipCensus.txt", encoding='cp1251', sep='\t',low_memory=False)
zip2_raw_bd = pd.read_csv("zipcounty.txt", encoding='cp1251', sep='\t',low_memory=False)

products_raw_bd = products_raw.reset_index()
customers_raw_bd = customers_raw.reset_index()
orders_raw_bd = orders_raw

BigData = pd.merge(orders_raw_bd, customers_raw_bd, on='customerid', how='outer')

# + id="TPG3Vw_Gm4C_" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 264} outputId="3e0ac774-01df-45bf-f9cb-040be4434b71"
# połączenie dataframe products i orderline. Metoda łączenia: INNER JOIN i klucz: 'productid'
orderlines_raw_bd = pd.read_csv("orderlines.txt",delimiter="\t", encoding="cp1251")
little_data = pd.merge(orderlines_raw_bd, products_raw_bd, on='productid', how='inner')

# ujednolicenie wielkości liter w nazwach kolumn zbiorów produktów i pozycji zamówień
products_raw_bd.columns = map(str.lower, products_raw_bd.columns)

BigData = pd.merge(little_data, BigData, on='orderid', how='inner')

differenc_table = BigData.numorderlines != BigData.numunits_y
BigData[differenc_table].head(3)

# + id="-Z1sVsUzm4DG" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 117} outputId="fab68641-1e13-47ab-e693-f002a06e8733"
#dodanie kolumn z miesiącami i latami
BigData.shipdate = pd.to_datetime(BigData.shipdate)
BigData.billdate = pd.to_datetime(BigData.billdate)
BigData['year'] = BigData.shipdate.dt.year

BigData.shipdate = pd.to_datetime(BigData.shipdate)
BigData.billdate = pd.to_datetime(BigData.billdate)
BigData['month'] = BigData.shipdate.dt.month
BigData.head(1)

# + id="NRXTw74FpF0z" colab_type="code" colab={}
#from google.colab import drive
#drive.mount('/content/drive')

# + id="oz7BK5pUm4DL" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 510} outputId="4721d542-19f0-40dd-aeb8-9989a0c81b68"
#sprawdzam jakiego typu zmienne występują w zbiorze (zmienne całkowite,
#zmiennoprzecinkowe, kategoryczne porządkowe, kategoryczne nominalne, zmienne typu logicznego, daty).
BigData.dtypes

# + id="A9OmJGRAm4DP" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 317} outputId="6676a488-1bcb-40a7-aa34-e4ab19f31892"
#podstawowe podsumowanie zbioru BigData
BigData.describe()

# + id="rNjCXtEAm4DU" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 917} outputId="6d975341-1f4e-48cd-8fae-ab8867f63ed8"
#sprawdzam czy w zbiorze występują braki danych
nulls_summary = pd.DataFrame(BigData.isnull().any(), columns=['Nulls'])
nulls_summary['Braki danych [ilość]'] = pd.DataFrame(BigData.isnull().sum())
nulls_summary['Braki danych [%]'] = round((BigData.isnull().mean()*100),2)
nulls_summary

# + [markdown] id="BX5ZCCYZm4Db" colab_type="text"
# ### Wyznaczam współczynniki skośności poszczególnych zmiennych numerycznych.

# + [markdown] id="wJD3EHgWm4Dc" colab_type="text"
#
#
#
#
# $$\Large {wspolczynnik}~{skosnosci} = 3 * \frac{srednia - mediana}{odchylenie~standardowe}$$
#
#
#
# Współczynnik o wartości $0$, to rozkład symetryczny.
# Współczynnik o wartości ujemnej to rozkład lewostronnie skośny (wydłużone lewe ramię rozkładu; średnia mniejsza od mediany).
# Współczynnik o wartości dodatniej to rozkład prawostronnie skośny (wydłużone prawe ramię rozkładu; średniej większa od mediany).
#
#

# + id="40mcp_epm4De" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 306} outputId="d4abc8bd-2bb0-4f20-8fa7-051764587b35"
#skośność rozkładów, oczywiście interesują mnie zmienne numeryczne, które pozwolą na analizę
BigData.skew()

# + [markdown] id="W5pprmNZm4Di" colab_type="text"
# ### Obserwacje odstające
# Zgodnie z regułą, obserwacją odstającą jest obserwacja, która przyjmuje wartość:
# Większą niż półtora odstępu międzykwartylowego $(Q3 – Q1)$, od trzeciego kwartyla$(Q3)$.
# Mniejszą niż półtora odstępu międzykwartylowego $(Q3 – Q1)$, od pierwszego kwartyla$(Q1)$.

# + id="tsrbvwHhm4Dj" colab_type="code" colab={} outputId="592c9b7b-7d7a-41fc-934d-8e195ef1b568"
#sprawdzam gdzie występują wartości odstające
Q_first = BigData.quantile(0.25)
Q_third = BigData.quantile(0.75)
iqr = Q_third-Q_first
low_boundary = (Q_first - 1.5 * iqr)
upp_boundary = (Q_third + 1.5 * iqr)
num_of_outliers_L = (BigData[iqr.index] < low_boundary).sum()
num_of_outliers_U = (BigData[iqr.index] > upp_boundary).sum()
wartosci_odstajace = pd.DataFrame({'niska_granica':low_boundary, 'wysoka_granica':upp_boundary,\
                         'wartosci_odstajace_L':num_of_outliers_L, 'wartosci_odstajace_U':num_of_outliers_U}) 
wartosci_odstajace

# + id="aHWHIS4bm4Dn" colab_type="code" colab={} outputId="c136ead5-9cb9-4c53-d182-3a571dbe7e4c"
#sprawdzam liczności zmiennych kategorycznych 
for col in BigData.select_dtypes(['object', 'category']):
    print(BigData[col].value_counts()) 

# + [markdown] id="ZW7Jo_12m4Dr" colab_type="text"
# ### Dane klientów

# + id="IL1Ylhc3m4Ds" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 235} outputId="0b424ae5-3952-4b62-949c-912968c0fd14"
#customers_raw - czyszczenie danych
customers_raw.head()


# + id="7aVNcGZim4Dy" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 142} outputId="79741341-adca-4d85-eb0c-7888da338f7d"
# INFO-Data Frame, w którym znajdują się wszystkie niezbędne informacje:
# nazwa zmiennej, informacja o jej typie,
#informacja czy dana zmienna zawiera braki,
#liczba braków, oraz procentowa brakującyh wartości w zmiennej

def informacja(df):
  info1 = pd.DataFrame(df.dtypes, columns=['Dtype'])
  info1['Nulls'] = pd.DataFrame(df.isnull().any())
  info1['Sum_of_nulls'] = pd.DataFrame(df.isnull().sum())
  info1['Per_of_nulls'] = round((df.apply(pd.isnull).mean()*100),2)
  info1.Dtype = info1.Dtype.astype(str)
  return(info1)

informacja(customers_raw)

# + id="zZI8gRfnm4D3" colab_type="code" colab={} outputId="97301065-2fa1-4a94-944c-053355634e7d"
customers = customers_raw.dropna()
customers.head()
#customers zmienna ostateczna zbioru customers.txt

# + [markdown] id="q34_ZEL6m4D8" colab_type="text"
# ### Dane o produktach

# + id="LkYoDeprm4D9" colab_type="code" colab={} outputId="50e8b939-4d22-491f-bace-2359bafd4a08"
#products_raw sprawdzanie i  czyszczenie danych po wybraniu kolumn
products_raw.head()

# + id="KupGsWdom4EA" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 204} outputId="2fc03af3-c18a-4e60-8669-fb73f5a9c36a"
informacja(products_raw)

# + id="Zbx1rzn7m4EE" colab_type="code" colab={} outputId="358f5c38-c7ab-4546-801d-e3def3c0b849"
#sprawdzam jakie kolumny zawiera Data Frame
products_raw.columns

# + id="sl4odqCLm4EL" colab_type="code" colab={} outputId="514eb9c0-b75b-4dea-c28a-0c3a986f7820"
#wybieram interesujące mnie kolumny
products_df = products_raw[['productgroupcode','productgroupname', 'fullprice']]#, 'instockflag'
products_df.info()

# + id="aZ1BJRQFm4EP" colab_type="code" colab={} outputId="a469a0f2-aeff-4461-ae75-e1986b40b7bd"
products_df.head()
#products_df zmienna ostateczna zbioru products.txt

# + [markdown] id="EoyRt83Bm4ET" colab_type="text"
# ### Dane o zamówieniach

# + id="TslMBhm1m4EU" colab_type="code" colab={} outputId="e29ad2ab-5742-4352-d1b1-c1b6f4c477de"
# orders_raw- czyszczenie danych
orders_raw.head()

# + id="ioJFSUbym4EX" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 390} outputId="80172be4-91c5-4db0-b0a4-87ce448c264e"
informacja(orders_raw)

# + id="0HzpJLs6m4Ed" colab_type="code" colab={} outputId="7ef936a4-0de7-4223-97b2-ed380bc716a9"
#procentowa znikomość niepełnych danych
orders = orders_raw.dropna()
orders.head()
#orders ostateczna zmienna orders.txt

# + id="wcEXqTyBm4Eh" colab_type="code" colab={} outputId="ed0a9bad-4483-43af-8c5b-d73f7d4b028e"
orders.info()

# + [markdown] id="PdGATafem4El" colab_type="text"
# ### Dane o liście zamówień 

# + id="5IcYy83tm4Em" colab_type="code" colab={} outputId="9bd1e303-8a36-468a-8033-1de516d67036"
orderlines_raw.head()

# + id="WxADRriZm4Er" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 297} outputId="d8a86f78-e72f-4a8f-fc93-a66f27ebed7b"
informacja(orderlines_raw)

# + id="5m_AO28Qm4Ev" colab_type="code" colab={} outputId="2ae9cf8c-f9b0-4a60-edcf-c3477ecefb97"
orderlines = orderlines_raw.dropna()
orderlines.info()
#ostateczna zmienna orderlines.txt

# + [markdown] id="OBArcKJum4E0" colab_type="text"
# ##  Statystyki podstawowe

# + [markdown] id="pHQHuJXSm4E1" colab_type="text"
# ####  Płeć klientów
#
# Spośród wszystkich klientów przedsiębiorstwa 55,7% stanowią mężczyźni a 44,3% kobiety. 
# Dane dotyczące płci klientów zostały przedstawione w postaci wykresu kołowego z zaznaczeniem etykiet danych.

# + id="anjmX4Vcm4E2" colab_type="code" colab={} outputId="619e31f6-1213-4196-d699-f4a25351eb1d"
plec = {"Mężczyźni":customers.gender[customers.gender == "M"].count(),"Kobiety": customers.gender[customers.gender == "F"].count()}
plec_df = pd.DataFrame({"genders": plec})
plec_df.plot.pie(subplots=True,  figsize=(6,6),  autopct='%1.1f%%', colors = ['#ff9999', '#66b3ff'],startangle=80)
_ = plt.title('Płeć klientów')

# + id="eJawXlrRm4E7" colab_type="code" colab={}
#łączę pliki customers i orders, dodając kolumny z latami i miesiącami
customers_and_orders = pd.merge(customers, orders, on="customerid")
customers_and_orders = customers_and_orders.dropna()
customers_and_orders['month'] = orders['orderdate'].dt.month
customers_and_orders['year'] = orders['orderdate'].dt.year
customers_and_orders = customers_and_orders.dropna()
customers_and_orders["year"] = customers_and_orders["year"].astype("int64")
customers_and_orders["month"] = customers_and_orders["month"].astype("int64")

# + id="AX5_au2Jm4E-" colab_type="code" colab={} outputId="86aa96fa-c487-43b5-e6c2-2ad6f1dc4be9"
customers_and_orders.head(2)

# + [markdown] id="KtwJ3iajm4FC" colab_type="text"
# ### Sprzedaż kolejnych latach - podział na płeć
#
# W latach 2009-2011 sprzedaż w firmie $XXX$ wyraźnie rosła. W $2012$ roku sprzedaż była na stałym poziomie i zaczęła podnosić się w latach $2013-2014$. Od roku $2015$ zaobserwowana spadek sprzedaży.
# Przez wszystkie lata udział mężczyzn w zakupach był większy niż kobiet.

# + id="u3PMB_kEm4FC" colab_type="code" colab={} outputId="f319763f-fbd0-49a9-dc9e-2f924d1f98dc"
plot1=BigData.groupby(['year', 'gender']).sum().loc[2009:2016].totalprice_x
plot1_a = pd.DataFrame(plot1)
sw = plot1_a.reset_index()

_= sns.catplot(x= "year", data  = sw, y="totalprice_x",\
                                     hue = "gender",kind="bar",aspect=2.5)\
.set(title = 'Wartość dokonanych zakupów w kolejnych latach - podział na płeć'\
     , ylabel = 'Sprzedaż', xlabel = 'Rok' )

# + id="-7O5YWBDm4FH" colab_type="code" colab={} outputId="1f624256-f4e4-40bb-83a4-bfb5af588333"
#zyski w kolejnych latach
year_total_price = orderlines.loc[:, ["year", "totalprice"]].groupby('year').sum().reset_index()
year_total_price.head(8)

# + id="an305unom4FL" colab_type="code" colab={} outputId="c28cecde-3322-4055-b683-dfbd34ab153c"
_ =year_total_price.plot(x = "year", y = "totalprice" ,kind="bar",figsize=(13,5.5))\
.set(title = 'Sprzedaż w poszczególnych latach',\
ylabel = 'Sprzedaż', xlabel = 'Rok')

# + [markdown] id="m-y8Aik8m4FP" colab_type="text"
# ### Sprzedaż kolejnych latach
#
# Wyraźnie można zaobserwować sezonowość sprzedaży w poszczególnych miesiącah. Szczególnie widoczne to jesr w grudniu od $2013$ roku. 

# + id="yfZAd1psm4FQ" colab_type="code" colab={} outputId="5eafa2dc-4f6f-459b-e00f-fdb21a1e0ec4"
#sprzedaż w poszczególnych latach z podziałem na miesiące
plot2=BigData.groupby(['year', 'month']).sum().loc[2009:2016].totalprice_x
plot2_a = pd.DataFrame(plot2)
sw2 = plot2_a.reset_index()
sw2=sw2.pivot("month", "year", "totalprice_x")

f, ax = plt.subplots(figsize=(12, 9))
_=sns.heatmap(sw2, annot=False, linewidths=.5, ax=ax, cmap="Greens")\
.set(title = 'Sprzedaż w poszczególnych latach w rozłożeniu na miesiące',\
ylabel = 'Miesiąc', xlabel = 'Rok')

# + [markdown] id="Y2GmEWImm4FT" colab_type="text"
# ### Sprzedaż z podziałem na grupy produktów
#
# Najczęściej kupowanym produktem były te z grupy $ARTWORK$, łącznie sprzedano ich za kwotę $1~427~905$ dolarów. Jest to też produkt, którego średnia cena jest najwyższa.
# Najmniej dochodowym artykułem są produkty z grupy $CALENDAR$.
#

# + id="IyWq8W1Gm4FU" colab_type="code" colab={} outputId="0aaa6533-f643-4d1a-9f0f-58548f618ffb"
#ilość zamówień (grupowanie wg produktu)
select = ["productgroupname","fullprice","numorders"]
orders_a = orderlines_raw.groupby("productid").agg({"orderid" : "nunique"}).rename(columns={'orderid': 'numorders'})
product_orders = pd.merge(orders_a, products_df, on ="productid")[select]
product_orders.sort_values(by = "numorders")
product_orders = product_orders[product_orders.fullprice != 0]
product_orders.head()

# + id="Ivv1MbZpm4FX" colab_type="code" colab={} outputId="f2c0af62-1e40-4972-8b31-9d5d8540a6ca"
#pogrupowanie produktów ze względu na rodzaj i obliczenia odnośnie ceny
product_ordersA = product_orders.groupby("productgroupname").agg({'fullprice': [np.mean, np.std,np.median, np.sum]})
product_ordersA

# + [markdown] id="I7q390Qim4Fa" colab_type="text"
# Średnią arytmetyczną ciągu wartości $x_1, \dots, x_n$ nazwyamy:
# $$\Large\bar{x}= \frac{x_{1} + x_{2} + \ \ldots \ + x_{n}}{n} = \frac{1}{n} \sum_{i=1}^{n} x_{i}$$  
#
#
# Medianą ciągu wartości $x_1, \dots, x_n$ nazywamy środkowy wyraz tego ciągu, gdy $n$ jest liczbą nieparzystą, w przeciwnym przypadku średnią arytmetyczną dwóch wyrazów środkowych.
#
# $\Large Mediana = Me = \left\{\begin{array} {lll} x_{(k+1)} &  \hbox{ dla } & n=2k+1 \\[1mm] \frac{x_{(k)}+x_{(k+1)}}{2} & \hbox{ dla } & n=2k. \end{array} \right.$,
# gdzie $x_{(1)} \le x_{(2)} \le  \dots \le x_{(n)}.$  
#
#
# Odchyleniem standardowym ciągu $x_1, \dots, x_n$ nazywamy wartość:
#
# $$\Large s_n = \sqrt{\frac{1}{n} \sum_{i=1}^{n} ( x_{i}-\bar{x})^{2}}$$

# + id="iwwcygmzm4Fb" colab_type="code" colab={} outputId="911d6ece-d719-4eeb-f715-e8c6e120b30d"
#wykres pudełkowy - produkty i cena całkowita
sns.set(style="whitegrid", palette="pastel")
_=sns.catplot(x ="productgroupname", y ="fullprice", kind="boxen",aspect=2.5,
            data =product_orders ).set(yscale="log")\
.set(title = 'Rozkład ceny całkowitej ze względu na grupę produktów'\
     , ylabel = 'Cena całkowita', xlabel = 'Rodzaj produktu' )

# + id="msqxsjN1m4Fg" colab_type="code" colab={} outputId="66ee5118-60ab-462b-a6c6-007d02689aa3"
#ilość artykułów a cena do zapłaty
_ =product_orders.plot(y = "numorders", x = "fullprice" , kind="scatter", s=40, figsize=(15,8), 
                     xlim =[0.1, 100000], ylim =[0.1,10000],
                     loglog= True,alpha=0.6, color = 'b')

# + id="b-pmt-Fjm4Fk" colab_type="code" colab={} outputId="25460205-0b62-4e64-ea50-c55eb122ade9"
# produkty z podziałem na rok
select = ["productid","year","productgroupname"]
product_years = pd.merge(products_df, orderlines, on ="productid")[select].groupby(["year","productgroupname"]).agg({"productid" : "count"}) \
.rename(columns={'productid': 'count'}).sort_values(by =["year","productgroupname"])

product_years.head()

# + id="q6pbQqNpm4Fm" colab_type="code" colab={} outputId="0bde0ffd-49c6-433b-dd82-82296ed12c88"
#ilość sprzedanych produktów z poszczególnych kategorii na przesrzeni lat
sns.set(style="whitegrid", palette='Set2')
product_years_index = product_years.reset_index()

_ =sns.catplot(x= "year", data = product_years_index, y="count", hue = "productgroupname",kind="bar",aspect=3)\
.set(title ='Ilość sprzedanych produktów w kolejnych latach', ylabel = 'Ilość', xlabel = 'Lata')

# + [markdown] id="xoUki7o_m4Fr" colab_type="text"
# ### Miasta z największym przychodem
#
# Analiza wykazuje, że  dziesięć, przynoszących nawiększy przychód, miast to: New York, Brooklyn, Chicago, Washington, Los Angeles, San Francisco, Houston, Atlanta, Dallas, Seattle.
# Liderem jeat $NEW~YORK$ z przychodem $1~571~296.06$ dolarów.

# + id="xbpCF40Vm4Fr" colab_type="code" colab={} outputId="e6dfc24c-c749-4b49-aba9-04b83c0b8acc"
city_totalprice = orders[['city', 'totalprice']]
city_totalprice_gr = city_totalprice.groupby('city').sum().reset_index().sort_values(by='totalprice', ascending=False).head(10)
city_totalprice_gr

# + id="IxfSUZTEm4Fx" colab_type="code" colab={} outputId="e4555d50-96d8-41eb-8f13-0ecb493f5227"
plt.figure(figsize=(15,6))
_ =sns.barplot(x="city", y = 'totalprice', data = city_totalprice_gr)#.set(yscale="log")

# + [markdown] id="ZX5KdpCnm4F1" colab_type="text"
# ## Karty kredytowe

# + [markdown] id="kfi_8P7fm4F2" colab_type="text"
# Na wykresie poniże widać jak popularne są karty kredytowe i ich udział w zakupach z podziałem na płeć.
# Zarówno wśród kobiet i mężczyzn nabardziej popularną kartą test $VI$. Kobiety rzadziej używają kart $MC$ i $AE$ niż mężczyźni.
# Najmniej popularne karty to $DB$ i $OC$.

# + id="2xzn3fQkm4F3" colab_type="code" colab={} outputId="39342662-baa0-4842-9ae2-8a3da8d9bcea"
#Rodzaj używanej karty płatniczej - podział we względu na płeć
gender_pay_typ = customers_and_orders[["orderid","gender","paymenttype",'year']]
plot_pay_g = gender_pay_typ.groupby(["paymenttype","gender",'year']).agg({"orderid" : "count"}).rename(columns={'orderid': 'count'}).sort_values(by =["paymenttype","gender",'year'])
plot_pay_g_index = plot_pay_g.reset_index()

_ =sns.catplot(x= "gender", data = plot_pay_g_index, y="count", hue = "paymenttype",kind="bar",aspect=2)\
.set(title ='Rodzaj używanej karty płatniczej', ylabel = 'Ilość', xlabel = 'Płeć')

# + [markdown] id="zkQsXN68m4F6" colab_type="text"
# #### Rodzaje płatności i ich udział w zakupach w kolejnych latach
#
# Poddano analizie rodzaje płatności oraz ich udział w zakupach w latach $2009-2016$. Największą popularnością cieszyły się karty $VI$, a najmniejszą $OC$. W stosunku do sumy rodzajów płatności stałym zainteresowaniem cieszą się płatności typu $AE$ oraz $MC$. Płatność lkartą $DB$ była popularna w latach $2009 - 2011$ działalności firmy, poczym zauważenie spadła do $2016$ roku.
#

# + id="wUD8tNLAm4F7" colab_type="code" colab={} outputId="9649cf0a-6684-4716-9a9d-c2eb3ccbc691"
#ilość płatności poszczególnymi kartami w latach 2009-2016
_ =sns.catplot(x= "year", data = plot_pay_g_index, y="count", hue = "paymenttype",kind="bar",aspect=3)\
.set(title ='Rodzaj używanej karty płatniczej', ylabel = 'Ilość płatności', xlabel = 'Lata')

# + [markdown] id="SJKvJXhKm4F-" colab_type="text"
# Największą ilość płatności odnotowana kartą $VI$.

# + id="zKuu0-9fm4F_" colab_type="code" colab={} outputId="e7595aff-e13d-4851-c19f-59fc096345ab"
#Karty kredytowe popularność tabela
pay_typ = customers_and_orders.groupby('paymenttype').orderid.count().sort_values(ascending=False)
pay_typ_df = pd.DataFrame(pay_typ).reset_index()
tabela_karty = pay_typ_df.rename(columns={'orderid': 'ilość płatności','paymenttype': 'rodzaj karty'})
tabela_karty.groupby('rodzaj karty').head(6)

# + id="kzUx51tbm4GD" colab_type="code" colab={} outputId="ba8e6724-34d2-40be-fb49-65e1f1db71c3"
#popularność kart kredytowych procentowo
#z poszukiwań w internecie uzyskałem prawdopodobne nazwy banków oferujące poszczególne karty
karty = {"1FirstBank":customers_and_orders.paymenttype[customers_and_orders.paymenttype == "VI"].count(),
        "MC Bank":customers_and_orders.paymenttype[customers_and_orders.paymenttype == "MC"].count(),
        "American Express":customers_and_orders.paymenttype[customers_and_orders.paymenttype == "AE"].count(),
        "Deutsche Bank":customers_and_orders.paymenttype[customers_and_orders.paymenttype == "DB"].count(),
        "Orange County":customers_and_orders.paymenttype[customers_and_orders.paymenttype == "OC"].count(),
        "OTHER":customers_and_orders.paymenttype[customers_and_orders.paymenttype == "??"].count()}

karty_df = pd.DataFrame({"paymenttype": karty})
karty_df.plot.pie(subplots=True,  figsize=(9,9),  autopct='%1.1f%%',startangle=75)
_ = plt.title('Popularność kart karedytowych')

# + [markdown] id="G2RxoI2bm4GH" colab_type="text"
# # Tabele

# + id="r1_X55grm4GI" colab_type="code" colab={} outputId="a821c12e-93bc-460f-c0ad-ec71c5bb7785"
# ilości sprzedanych towarów - podział z uwzględnieniem kategorii produktów i lat
tab_prod_year = pd.pivot_table(BigData, values='numunits_x', index=['productgroupname'],\
                               columns=['year'],aggfunc={'numunits_x': np.sum}, fill_value='0',\
                               margins=True, margins_name='Sum')
tab_prod_year.sort_values(by=['Sum'], ascending=False, axis=0)

# + id="jw-PLPI3m4GK" colab_type="code" colab={} outputId="f05e0a66-dd7c-4639-d31c-de30c65ca491"
# ilości sprzedanych towarów - TOP 10 miast, podział z uwzględnieniem kategorii produktów
sum_units = orderlines['numunits'].sum()
pd.reset_option("display.float_format")

tab_city_prod = pd.pivot_table(BigData, values='numunits_x', index=['city'],\
                               columns=['productgroupname'], aggfunc={'numunits_x': np.sum},\
                               fill_value='0', margins=True, margins_name='Sum')
tab_city_prod['Percent'] = tab_city_prod['Sum'] / sum_units * 100
tab_city_prod.sort_values(by=['Sum'], ascending=False, axis=0).head(11)

# + id="HOB4yhPum4GN" colab_type="code" colab={} outputId="ec964af8-3487-4779-ac35-45f69a25ff1c"
#sezonowość sprzedaży produktów 
tab_month_prod = pd.pivot_table(BigData, values='numunits_x', index=['productgroupname'],\
                                columns=['month'], aggfunc={'numunits_x': np.sum}, fill_value='0',\
                                margins=True, margins_name='Sum')
tab_month_prod .sort_values(by=['Sum'], ascending=False, axis=0)

# + id="-cWz5cRrm4GP" colab_type="code" colab={} outputId="0c068af1-5f82-4e5b-c6a7-57165fea9f56"
#sezonowość sprzedaży w kolejnych miesiącach z podziałem na płeć
_ = sns.relplot(y="totalprice", x="month", data =customers_and_orders, hue = 'gender', kind="line",aspect=3)

# + id="Im1pLDFam4GS" colab_type="code" colab={} outputId="9d9e1de6-9bb3-473d-bb22-1e313b458e8d"
sns.set(style="whitegrid", palette="pastel")
_=sns.catplot(x ="month", y ="totalprice", kind="box",aspect=3,
            data =customers_and_orders, hue = 'gender', showfliers = False )\
.set(title = 'Rozkład ceny z podziałem na kobiety i męższczyzn w kolejnych miesiącach',\
     xlabel = 'Miesiące', ylabel = "Cena całkowita")

# + [markdown] id="h8ZAI-Iem4GV" colab_type="text"
# ## Testy statystyczne

# + [markdown] id="J55VGRYqm4GV" colab_type="text"
# ### Przy pomocy testu Shapiro-Wilka zbadam czy próba (ilość produktów w jednym zamówieniu) pochodzi z rozkładu normalnego
#
# Przy pomocy testu Shapiro-Wilka możemy przetestować, czy dana próba $X = (x_1, \dots, x_n)$ pochodzi z rozkładu normalnego.
# Formułujemy w tym celu hipotezę zerową i hipotezę alternatywną
#
# $H_0$: „dane pochodzą z rozkładu normalnego”.
#
# $H_1$: „dane nie pochodzą z rozkładu normalnego”.
#
# $$\Large W=\frac{(\sum_{i=1}^{n}a_{i}x_{(i)})^2}{\sum_{i=1}^{n}(x_i-\overline{x})^2}$$
#
#
# Jako miarę istotności wnioskowania, ustalamy poziom istotności $\alpha$ jako maksymalne prawdopodobieństwo popełnienia błędu pierwszego rodzaju, czyli odrzucenia $H_0$ mimo jej prawdziwości. Zazwyczaj przyjmujemy w tym celu wartość $\alpha=0.05$ lub mniejszą.
#
# Wynikiem testu Shapiro-Wilka jest para liczb:
# wartość statystyki testowej $W$ i p-wartość $p$, czyli prawdopodobieństwo otrzymania naszych (lub bardziej ekstremalnych) danych z rozkładu normalnego.
#
# Hipotezę zerową możemy odrzucić jeżeli $p<α$.

# + id="DyF99sNZm4GW" colab_type="code" colab={} outputId="78e2dc3f-9167-4d27-dd60-88bae54a1c46"
#wykres rozkładu normalnego
sns.set(); np.random.seed(0)
g = np.random.randn(100)
ax = sns.distplot(g, hist=False, color ='g').set(title = "Wykres rozkładu normalnego")

# + id="fNJ0Wedmm4GZ" colab_type="code" colab={}
#dane do testu to ilość produktów w jednym zamówieniu
pd.set_option('float_format', '{:.3f}'.format)
test_dane = BigData[[ 'orderid', 'numunits_x']]

test_dane_gr = test_dane.groupby(by = 'orderid').sum()
lista = test_dane_gr['numunits_x'].tolist()

# + id="9eiYCmEUm4Gg" colab_type="code" colab={} outputId="8e5e5357-02e7-4fe3-b13b-5a447c1f4438"
#ponieważ test Shapiro-Wilka sprawda się w próbach N < 500,
#niekiedy w literaturze podawana jest nawet wartość N < 100
#na potrzeby przeprowadzenie testu wybiorę losowo z całej próby 500 przypadków
lista2 = random.sample(lista, 500)
alpha = 0.05
X = lista2

W, p = scipy.stats.shapiro(X)

if (p < alpha) :
  print("p < alpha \nDane nie pochodzą z rozkładu normalnego.")
else :
  print( "Nie można odrzucić hipotezy o normalności rozkładu.")
print("W=",W," ","p=",p)


# + id="rJOcWu7Cm4Gl" colab_type="code" colab={} outputId="02b68ec0-c35c-4cc9-d2c1-9e3956429dd3"
_= sns.kdeplot(lista2, shade=True, color ='g').set(title = "Wykres rozkładu dla badanych danych")

# + [markdown] id="3NUrZNm2m4Gp" colab_type="text"
# Test potwierdza:
# $H_1$: „dane nie pochodzą z rozkładu normalnego”.

# + [markdown] id="5R7Sh7iqm4Gq" colab_type="text"
# ### Test Kołmogorowa-Smirnowa
#
# Stosowany alternatywnie do testu Shapiro-Wilka przy prubach większych.
#
# Przy pomocy testu Kołmogorowa-Smirnowa możemy przetestować, czy dana próba $X = (x_1, \dots, x_n)$ pochodzi ze wskazanego, znanego rozkładu. Działamy podobnie jak w teście Shapiro-Wilka.
#
# $$\Large K_n = \sup_{x} |(F_{n}-F) (x)|$$
#
#
# Wynikiem testu Kołmogorowa-Smirnowa jest para liczb:
# wartość statystyki testowej $D$ i p-wartość $p$, czyli prawdopodobieństwo otrzymania naszych (lub bardziej ekstremalnych) danych ze wskazanego rozkładu.
# Hipotezę zerową możemy odrzucić jeżeli $p<α.$

# + id="EFQzuZf0m4Gr" colab_type="code" colab={} outputId="7bae2722-1544-4afc-8d72-bcfc3ddf72a8"
#dane do testu Kołmogorowa-Smirnowa to wszystkie zamówienie i liczba artykułów w jednym zamówieniu

alpha = 0.05
x = lista
D, p = kstest(x, 'norm', args=(np.mean(x),np.std(x,ddof=1)))

if (p < alpha) :
  print("Dane nie pochodzą z rozkładu normalnego.")
else :
  print ("Nie można odrzucić hipotezy o normalności rozkładu")
print("D=",D," ","p=",p)

# + [markdown] id="2wx22HaAm4Gu" colab_type="text"
# __________________________________________________________________________________________________________________

# + [markdown] id="MD8nKNxBm4Gv" colab_type="text"
# ### Podsumowanie
#
# W przedsiębiorstwie $XXX$ większość klientów, a co za tym idzie zamówień, stanowią mężczyźni. Jest to jednak stosunek około $55$% do $45$%. Największą popularnością cieszą się produkty z grupy $BOOK$ i $ARTWORK$, z których te drugie przynoszą największe zyski dla firmy. Zdecydowanie największą sprzedaż firma $XXX$ posiada w Nowym Jorku, w którym sprzedaż produktów znacznie przewyższa sprzedaż w innych miastach. W $2014$ roku przedsiębiorstwo osiągneło najwyższą sprzedaż a co za tym idzie zyski, które , niestyty, w kolejnych dwóch latach zaczęły spadać. 
# Analiza wyników sprzedaży pozwala na wyciąganie wniosków przez zarząd firmy $XXX$ dotyczących m.in.: pracy handlowców i systemów motywacyjnych, produktów, klientów oraz systemu planowania. Analiza struktury klientów jest równie ważna jak analiza produktów. Dzięki niej zarząd może ocenić, którzy klienci najbardziej przyczyniają się do wzrostu poziomu sprzedaży oraz jej rentowności.
# Warto zwrócić również uwagę na lokalizacę najwyższej sprzedaży. $Nowy York$ nie jest miastem o wiele większym niż $Los$ $Angeles$ czy $Chicago$. Tym bardziej zastanawiająca jest zatrważająca przewaga w sprzedaży.

# + [markdown] id="chkiYFu_m4Gw" colab_type="text"
# __________________________________________________________________________________________________________________

StarcoderdataJupyterScriptsDedupFiltered