[雪峰磁针石博客]数据科学入门3-统计学简介

作者: oychw | 来源:发表于2018-07-31 06:39 被阅读2次
    # -*- coding: utf-8 -*-
    from collections import Counter
    from linear_algebra import sum_of_squares, dot
    import math
    import matplotlib.pyplot as plt
    
    from pylab import mpl
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    
    num_friends = [100,49,41,40,25,21,21,19,19,18,18,16,15,15,15,15,14,14,13,13,13,13,12,12,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,8,8,8,8,8,8,8,8,8,8,8,8,8,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    
    def make_friend_counts_histogram(plt):
        friend_counts = Counter(num_friends)
        xs = range(101)
        ys = [friend_counts[x] for x in xs]
        plt.bar(xs, ys)
        plt.axis([0,101,0,25])
        plt.title("朋友数的直方图")
        plt.xlabel("朋友个数")
        plt.ylabel("人数")
        plt.show()
    
    num_points = len(num_friends)               # 204
    
    largest_value = max(num_friends)            # 100
    smallest_value = min(num_friends)           # 1
    
    sorted_values = sorted(num_friends)
    smallest_value = sorted_values[0]           # 1
    second_smallest_value = sorted_values[1]    # 1
    second_largest_value = sorted_values[-2]    # 49
    
    # this isn't right if you don't from __future__ import division
    def mean(x):
        return sum(x) / len(x)
    
    # 不排序计算中位数的方法:https://en.wikipedia.org/wiki/Quickselect
    def median(v):
        """发现中值"""
        n = len(v)
        sorted_v = sorted(v)
        midpoint = n // 2
    
        if n % 2 == 1:
            # 如果是奇数,返回中间值
            return sorted_v[midpoint]
        else:
            # 如果是偶数,返回中间两个值的均值
            lo = midpoint - 1
            hi = midpoint
            return (sorted_v[lo] + sorted_v[hi]) / 2
    
    def quantile(x, p):
        """returns the pth-percentile value in x"""
        p_index = int(p * len(x))
        return sorted(x)[p_index]
    
    def mode(x):
        """returns a list, might be more than one mode"""
        counts = Counter(x)
        max_count = max(counts.values())
        return [x_i for x_i, count in counts.items()
                if count == max_count]
    
    # 离散度是数据的离散程度的一种度量。通常,如果它所统计的值接近零,则表示数据聚集
    # 在一起,离散程度很小,如果值很大(无论那意味着什么),则表示数据的离散度很大。
    def data_range(x):
        return max(x) - min(x)
    
    def de_mean(x):
        """translate x by subtracting its mean (so the result has mean 0)"""
        x_bar = mean(x)
        return [x_i - x_bar for x_i in x]
    
    def variance(x):
        """assumes x has at least two elements"""
        n = len(x)
        deviations = de_mean(x)
        return sum_of_squares(deviations) / (n - 1)
    
    def standard_deviation(x):
        return math.sqrt(variance(x))
    
    def interquartile_range(x):
        return quantile(x, 0.75) - quantile(x, 0.25)
    
    ####
    #
    # CORRELATION
    #
    #####
    
    daily_minutes = [1,68.77,51.25,52.08,38.36,44.54,57.13,51.4,41.42,31.22,34.76,54.01,38.79,47.59,49.1,27.66,41.03,36.73,48.65,28.12,46.62,35.57,32.98,35,26.07,23.77,39.73,40.57,31.65,31.21,36.32,20.45,21.93,26.02,27.34,23.49,46.94,30.5,33.8,24.23,21.4,27.94,32.24,40.57,25.07,19.42,22.39,18.42,46.96,23.72,26.41,26.97,36.76,40.32,35.02,29.47,30.2,31,38.11,38.18,36.31,21.03,30.86,36.07,28.66,29.08,37.28,15.28,24.17,22.31,30.17,25.53,19.85,35.37,44.6,17.23,13.47,26.33,35.02,32.09,24.81,19.33,28.77,24.26,31.98,25.73,24.86,16.28,34.51,15.23,39.72,40.8,26.06,35.76,34.76,16.13,44.04,18.03,19.65,32.62,35.59,39.43,14.18,35.24,40.13,41.82,35.45,36.07,43.67,24.61,20.9,21.9,18.79,27.61,27.21,26.61,29.77,20.59,27.53,13.82,33.2,25,33.1,36.65,18.63,14.87,22.2,36.81,25.53,24.62,26.25,18.21,28.08,19.42,29.79,32.8,35.99,28.32,27.79,35.88,29.06,36.28,14.1,36.63,37.49,26.9,18.58,38.48,24.48,18.95,33.55,14.24,29.04,32.51,25.63,22.22,19,32.73,15.16,13.9,27.2,32.01,29.27,33,13.74,20.42,27.32,18.23,35.35,28.48,9.08,24.62,20.12,35.26,19.92,31.02,16.49,12.16,30.7,31.22,34.65,13.13,27.51,33.2,31.57,14.1,33.42,17.44,10.12,24.42,9.82,23.39,30.93,15.03,21.67,31.09,33.29,22.61,26.89,23.48,8.38,27.81,32.35,23.84]
    
    def covariance(x, y):
        n = len(x)
        return dot(de_mean(x), de_mean(y)) / (n - 1)
    
    def correlation(x, y):
        stdev_x = standard_deviation(x)
        stdev_y = standard_deviation(y)
        if stdev_x > 0 and stdev_y > 0:
            return covariance(x, y) / stdev_x / stdev_y
        else:
            return 0 # if no variation, correlation is zero
    
    outlier = num_friends.index(100) # index of outlier
    
    num_friends_good = [x
                        for i, x in enumerate(num_friends)
                        if i != outlier]
    
    daily_minutes_good = [x
                          for i, x in enumerate(daily_minutes)
                          if i != outlier]
    
    
    
    if __name__ == "__main__":
        make_friend_counts_histogram(plt)
        print("num_points", len(num_friends))
        print("largest value", max(num_friends))
        print("smallest value", min(num_friends))
        print("second_smallest_value", sorted_values[1])
        print("second_largest_value", sorted_values[-2]  )
        print("mean(num_friends)", mean(num_friends))
        print("median(num_friends)", median(num_friends))
        print("quantile(num_friends, 0.10)", quantile(num_friends, 0.10))
        print("quantile(num_friends, 0.25)", quantile(num_friends, 0.25))
        print("quantile(num_friends, 0.75)", quantile(num_friends, 0.75))
        print("quantile(num_friends, 0.90)", quantile(num_friends, 0.90))
        print("mode(num_friends)", mode(num_friends))
        print("data_range(num_friends)", data_range(num_friends))
        print("variance(num_friends)", variance(num_friends))
        print("standard_deviation(num_friends)", standard_deviation(num_friends))
        print("interquartile_range(num_friends)", interquartile_range(num_friends))
    
        print("covariance(num_friends, daily_minutes)", covariance(num_friends, daily_minutes))
        print("correlation(num_friends, daily_minutes)", correlation(num_friends, daily_minutes))
        print("correlation(num_friends_good, daily_minutes_good)", correlation(num_friends_good, daily_minutes_good))
    

    执行结果

    图片.png
    num_points 204
    largest value 100
    smallest value 1
    second_smallest_value 1
    second_largest_value 49
    mean(num_friends) 7.333333333333333
    median(num_friends) 6.0
    quantile(num_friends, 0.10) 1
    quantile(num_friends, 0.25) 3
    quantile(num_friends, 0.75) 9
    quantile(num_friends, 0.90) 13
    mode(num_friends) [6, 1]
    data_range(num_friends) 99
    variance(num_friends) 81.54351395730716
    standard_deviation(num_friends) 9.03014473623248
    interquartile_range(num_friends) 6
    covariance(num_friends, daily_minutes) 22.425435139573064
    correlation(num_friends, daily_minutes) 0.24736957366478218
    correlation(num_friends_good, daily_minutes_good) 0.5736792115665573
    

    实际上NumPy已经实现了上面功能。更多python数据分析库

    可爱的python测试开发库 请在github上点赞,谢谢!
    python中文库文档汇总
    [雪峰磁针石博客]python3标准库-中文版
    [雪峰磁针石博客]python3快速入门教程
    接口自动化性能测试线上培训大纲
    python测试开发自动化测试数据分析人工智能自学每周一练
    更多内容请关注 雪峰磁针石:简书

    • 技术支持qq群: 144081101(后期会录制视频存在该群群文件) 591302926 567351477 钉钉免费群:21745728

    • 道家技术-手相手诊看相中医等钉钉群21734177 qq群:391441566 184175668 338228106 看手相、面相、舌相、抽签、体质识别。服务费50元每人次起。请联系钉钉或者微信pythontesting

    相关文章

      网友评论

        本文标题:[雪峰磁针石博客]数据科学入门3-统计学简介

        本文链接:https://www.haomeiwen.com/subject/vbqcvftx.html