[これがデータ解析WithPython]01です.データ内の内部サイトを検索[1]


本書は、「これがデータ分析WithPython」の内容を参考にした.

本章の核心概念

  • ナビゲーションデータ分析について説明します.
  • Pandas、Numpy、Matplotlibなどのツールを使用して分析することを熟知しています.
  • は、適切な可視化方法でサイトを発見します.
  • 1-1探索データ分析プロセス


    探索的データ分析はデータの情報を把握し,問題解決に必要なヒントを分析する過程である.

    raw data


    rawデータは、実際に接触したデータの大部分であり、分析または精製に使用されていないデータである.

    探索的データ分析プロセス

  • データのソースとトピックについて説明します.
  • データはどこで生成されますか?
  • データはどのように収集されますか?
  • データの名前、コンポーネント、ソース、およびトピックは何ですか.
  • データのサイズについて説明します.
  • ステップ
  • は、概ねのデータ量または数
  • を理解する.
  • データのサイズによっては、特殊な種類のサンプリングも必要です.
  • データの構成要素を表示します.
  • の特性は、データを構成する要素を意味する.
    (ex.学生健診データ-身長、体重、視力、聴力など)
  • 身長体重...視力聴力賢雄171571.52...尚允180782.01日恵161540.51

    データのプロパティの参照


    データの実際の内容を探索する過程で,特徴の属性探索と特徴間の相関探索を行う.

    フィーチャーのプロパティの参照


    クラスの平均身長を計算し、平均値だけでなく、標準偏差、中央値、データの四分位数などの統計値を求めます.これが定量的属性を定義します.
    特徴の属性探索過程において,最も重要なのはデータの問題を提起することである.

    フィーチャー間の依存関係の参照


    クラスの肥満度に好奇心を持つと、体重という特徴値が自然に見られます.しかし、「身長」の値も「体重」の値と関係がある.この場合,互いの関係を探索することが必要である.
    データ解析では,特徴間の公分散,相関係数などの概念を含む統計的手法により理解できる.

    ナビゲーションデータの表示


    データの可視化は、数値データだけでは把握しにくいパターンやサイトの発見に役立ちます.

    1-2メキシコ風チェーン店chipotleの注文データを分析する


    サンプルデータのダウンロード
    import pandas as pd
    file_path = 'python-data-analysis-master/data/chipotle.tsv'
    #read_csv()함수로 데이터를 데이터 프레임 형태로 불러온다.
    chipo = pd.read_csv(file_path,sep = '\t')
    
    print(chipo.shape)
    print("===============================")
    print(chipo.info())
    chipotleデータセットの基礎情報を出力します.
    # chipo라는 데이터 프레임에서 순서대로 10개의 데이터를 보여줍니다.
    chipo.head(10)
    
    print(chipo.columns)
    print("===============================")
    print(chipo.index)


    quantityとitem priceの値は連続型featureです.
    区分名フィーチャー例数値型フィーチャー連続型フィーチャーある区間のすべての値をデータとして使用できます.身長、体重は非連続型を数えることができ、一定区間にはいくつかの固定値が必要です.年齢カテゴリ型特徴順序のカテゴリ型特徴順序があるが,数値ではない.単位(A,B,C)の順序がないカテゴリ型特徴データは区別されるが,順序がない.血液型
    フィーチャーシェイプのタイプテーブル

    特徴の基礎統計量をdescrib()関数で表示します。

    #order_id는 숫자의 의미를 가지지 않기 때문에 str으로 변환합니다.
    chipo['order_id'] = chipo['order_id'].astype(str)
    print(chipo.describe()) # 수치형 피처들의 기초 통계량을 확인

    上記の統計データから平均発注数は1.07であることがわかります.
    item price()の数値フィーチャーはobjectタイプなのでdescribe()関数では見ることができません.データの前処理作業で見ることができます.

    Unique()関数を使用してカテゴリフィーチャーの数を出力する

    print(len(chipo['order_id'].unique()))
    print(len(chipo['item_name'].unique()))
    실행결과
    1834
    50

    内部サイトの検出:ブラウズとビジュアル化


    一番多く注文したものの上位10位


    最も多く注文されたアイテムTOP 10を分析するために、DataFrame["column"]の形状にvalue counts()関数を適用するには、以下の方法を使用します.DataFrame['column']は、value counts()関数がseriesオブジェクトにのみ適用されるため、seriesという名前のオブジェクトを返します.
    #가장 많이 주문한 아이템 Top 10을 출력
    item_count = chipo['item_name'].value_counts()[:10]
    for idx, (val,cnt) in enumerate(item_count.iteritems(),1):
        print("Top",idx,":",val,cnt)
    출력결과
    Top 1 : Chicken Bowl 726
    Top 2 : Chicken Burrito 553
    Top 3 : Chips and Guacamole 479
    Top 4 : Steak Burrito 368
    Top 5 : Canned Soft Drink 301
    Top 6 : Steak Bowl 211
    Top 7 : Chips 211
    Top 8 : Bottled Water 162
    Top 9 : Chicken Soft Tacos 115
    Top 10 : Chips and Fresh Tomato Salsa 110

    物品ごとの注文数量と総量


    groupby()関数は、データフレーム内の特定のフィーチャーに基づいてグループを作成し、パケット演算を適用できます.
    #아이템별 주문 개수를 출력
    order_count = chipo.groupby('item_name')['quantity'].count()
    order_count[:10]
    실행 결과
    item_name
    6 Pack Soft Drink         54
    Barbacoa Bowl             66
    Barbacoa Burrito          91
    Barbacoa Crispy Tacos     11
    Barbacoa Salad Bowl       10
    Barbacoa Soft Tacos       25
    Bottled Water            162
    Bowl                       2
    Burrito                    6
    Canned Soda              104
    Name: quantity, dtype: int64
    #아이템별 주문 총량을 출력
    item_quantity = chipo.groupby('item_name')['quantity'].sum()
    item_quantity[:10]
    실행결과
    item_name
    6 Pack Soft Drink         55
    Barbacoa Bowl             66
    Barbacoa Burrito          91
    Barbacoa Crispy Tacos     12
    Barbacoa Salad Bowl       10
    Barbacoa Soft Tacos       25
    Bottled Water            211
    Bowl                       4
    Burrito                    6
    Canned Soda              126
    Name: quantity, dtype: int64

    ビジュアル化

    item_name_list = item_quantity.index.tolist()
    x_pos = np.arange(len(item_name_list))
    order_cnt = item_quantity.values.tolist()
    
    plt.bar(x_pos, order_cnt,align='center')
    plt.ylabel('ordered_item_count')
    plt.title('Distribution of all orderd item')
    
    plt.show()

    データプリプロセッシング:プリプロセッシング関数の使用


    item priceのタイプは文字列なので統計データは取得できません.このフェーズは、データの前処理方法フェーズです.
    # column 단위 데이터에 apply() 함수로 전처리하기
    chipo['item_price'] = chipo['item_price'].apply(lambda x: float(x[1:]))
    chipo.describe()
    실행결과
            quantity	item_price
    count	4622.000000	4622.000000
    mean	1.075725	7.464336
    std	0.410186	4.245557
    min	1.000000	1.090000
    25%	1.000000	3.390000
    50%	1.000000	8.750000
    75%	1.000000	9.250000
    max	15.000000	44.250000
    
    apply()関数は、シリーズユニット演算を処理する機能を実行します.

    探索性分析:20の手がかりで概念性探索を分析する


    受注ごとの平均計算金額出力

    chipo.groupby('order_id')['item_price'].sum().mean()
    실행결과
    18.811428571428568

    オーダーごとに10ドル以上のオーダー番号出力を支払う

    chipo_orderid_group = chipo.groupby('order_id').sum()
    result = chipo_orderid_group[chipo_orderid_group.item_price >= 10]
    print(result)
    # 결과에서 2,3,4 는 int 형이 아닌 str이기 때문에 뒤로 밀려남
    실행결과
              quantity  item_price
    order_id                      
    1                4       11.56
    10               2       13.20
    100              2       10.08
    1000             2       20.50
    1001             2       10.08
    ...            ...         ...
    995              3       24.95
    996              4       43.00
    997              2       22.50
    998              2       10.88
    999              5       29.25
    
    [1834 rows x 2 columns]

    品物ごとの価格を得る

    chipo_one_item = chipo[chipo.quantity == 1]
    price_per_item = chipo_one_item.groupby('item_name').min()
    price_per_item.sort_values(by = "item_price", ascending = True)[:10]
    실행결과
    
                  order_id	quantitle choice_description item_price
    item_name				
    Bottled Water	1009	1	   NaN	              1.09
    Canned Soda	100	1	   [Coca Cola]	      1.09
    Canned Soft Drink	1003	1  [Coke]	      1.25
    Side of Chips	1002	1	   NaN	              1.69
    Chips	        1005	1	   NaN	              1.99
    Chips and Fresh Tomato Salsa	1	1	NaN	2.29
    Chips and Tomatillo-Red Chili Salsa	1215	1	NaN	2.39
    Chips and Tomatillo-Green Chili Salsa	1	1	NaN	2.39
    Chips and Roasted Chili-Corn Salsa	1156	1	NaN	2.39
    Chips and Tomatillo Red Chili Salsa	1020	1	NaN	2.95
    
    sort values()関数のパラメータ昇順がfalseの場合は降順です.
    item_name_list = price_per_item.index.tolist()
    x_pos = np.arange(len(item_name_list))
    item_price = price_per_item['item_price'].tolist()
    
    # 상품 가격 분포 그래프
    plt.bar(x_pos, item_price, align='center')
    plt.ylabel("item_price($)")
    plt.title("Distribution of item price")
    plt.show()
    
    # 상품 가격 히스토그램
    plt.hist(item_price)
    plt.ylabel("count")
    plt.title("Histogram of item price")
    plt.show()