Untitled

From Ungracious Gibbon, 4 Months ago, written in Plain Text, viewed 207 times.
URL http://codebin.org/view/600b374a Embed
Download Paste or View Raw
  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. from scipy import stats as st
  4. import numpy as np
  5. import math
  6.  
  7.  
  8.  
  9.  
  10. data1 = pd.read_csv('/datasets/users_go.csv')
  11. display(data1.head(10))
  12. display(data1.info())
  13. display(data1.shape)
  14. display(data1.isna().sum())
  15.  
  16.  
  17. data2 = pd.read_csv('/datasets/rides_go.csv')
  18. display(data2.head(10))
  19. display(data2.info())
  20. display(data2.shape)
  21. display(data2.isna().sum())
  22.  
  23.  
  24.  
  25. data3 = pd.read_csv('/datasets/subscriptions_go.csv')
  26. display(data3.head(10))
  27. display(data3.info())
  28. display(data3.shape)
  29. display(data3.isna().sum())
  30.  
  31.  
  32.  
  33. data2['date'] = pd.to_datetime(data2['date'], format='%Y-%m-%d')
  34.  
  35.  
  36.  
  37.  
  38. data2['month'] = data2['date'].dt.month
  39.  
  40.  
  41.  
  42.  
  43. data1 = data1.drop_duplicates()
  44. data1 = data1.reset_index(drop=True)
  45.  
  46.  
  47.  
  48. data2.duplicated().sum()
  49.  
  50.  
  51.  
  52.  
  53. data3.duplicated().sum()
  54.  
  55.  
  56.  
  57.  
  58.  
  59. data1['city'].value_counts().plot(kind='bar');
  60. plt.title('Количество пользователей в каждом городе');
  61. data1['city'].value_counts()
  62.  
  63.  
  64.  
  65.  
  66.  
  67. data1['subscription_type'].value_counts().plot(kind='pie', autopct='%.1f%%');
  68. plt.title('Количество пользователей по категориям');
  69. print(f'Пользователей без подписки:', '54.3%')
  70. print(f'Пользователей c подпиской:', '45.7%')
  71.  
  72.  
  73.  
  74.  
  75. data1['age'].hist (bins= 100, figsize = (10,5));
  76. plt.title('Количество пользователей по возрасту');
  77.  
  78.  
  79.  
  80.  
  81.  
  82. data2['distance'].hist(bins=100, figsize = (10,5))
  83. plt.title('Расстояние поездок у пользователей');
  84. plt.xlabel('Расстояние, м.');
  85. data2['distance'].describe()
  86.  
  87.  
  88.  
  89.  
  90.  
  91. data2['duration'].hist(bins=100, figsize = (10,5))
  92. plt.title('Продолжительность аренды у пользователей');
  93. plt.xlabel('Время, м.');
  94. data2['duration'].describe()
  95.  
  96.  
  97.  
  98.  
  99.  
  100. data4=data1.merge(data2, on='user_id', how='left')
  101. data4
  102.  
  103.  
  104.  
  105.  
  106. data5 = data4.loc[data4['subscription_type'] == 'ultra']
  107. data6 = data4.loc[data4['subscription_type'] == 'free']
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114. data5['distance'].hist(bins=100, figsize = (10,5))
  115. plt.title('Расстояние поездок у пользователей, оформивших платную подписку');
  116. plt.xlabel('Расстояние, м.');
  117. plt.show()
  118. data5['duration'].hist(bins=100, figsize = (10,5))
  119. plt.title('Продолжительность поездок у пользователей, оформивших платную подписку');
  120. plt.xlabel('Время, м.');
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127. data6['distance'].hist(bins=100, figsize = (10,5))
  128. plt.title('Расстояние поездок у пользователей, не оформлявших платную подписку');
  129. plt.xlabel('Расстояние, м.');
  130. plt.show()
  131. data6['duration'].hist(bins=100, figsize = (10,5))
  132. plt.title('Продолжительность поездок у пользователей, не оформлявших платную подписку');
  133. plt.xlabel('Время, м.');
  134.  
  135.  
  136.  
  137.  
  138.  
  139. i = data6[data6['duration'] < 1.0]
  140. i
  141.  
  142.  
  143.  
  144.  
  145.  
  146. data4 = data4.query('duration > 1.0')
  147. data5 = data4.loc[data4['subscription_type'] == 'ultra']
  148. data6 = data4.loc[data4['subscription_type'] == 'free']
  149.  
  150.  
  151.  
  152.  
  153.  
  154. data6['distance'].hist(bins=100, figsize = (10,5))
  155. plt.title('Расстояние поездок у пользователей, не оформлявших платную подписку');
  156. plt.xlabel('Расстояние, м.');
  157. plt.show()
  158. data6['duration'].hist(bins=100, figsize = (10,5))
  159. plt.title('Продолжительность поездок у пользователей, не оформлявших платную подписку');
  160. plt.xlabel('Время, м.');
  161.  
  162.  
  163.  
  164.  
  165.  
  166. data4_pivot = data4.pivot_table(index=['user_id', 'month'],
  167.                   values=['distance', 'duration', 'name', 'subscription_type'],
  168.                   aggfunc={'distance':'sum', 'duration':'sum', 'name':'count', 'subscription_type': 'min'})
  169. data4_pivot.columns = ['total_distance', 'total_duration', 'trip_count', 'subscription_type']
  170.  
  171. data4_pivot
  172.  
  173.  
  174.  
  175.  
  176. data4_pivot['total_duration'] = round(data4_pivot['total_duration'], 0)
  177.  
  178.  
  179.  
  180. def money(row):
  181.     total_distance = row['total_distance']
  182.     total_duration = row['total_duration']
  183.     trip_count = row['trip_count']
  184.     subscription_type = row['subscription_type']
  185.    
  186.     if subscription_type == 'ultra':
  187.         return total_duration * 6 + 199
  188.     if subscription_type == 'free':
  189.         return total_duration * 8 + trip_count * 50
  190.  
  191.  
  192.  
  193. data4_pivot['money'] = data4_pivot.apply(money, axis=1)
  194.  
  195.  
  196.  
  197. alpha = 0.05
  198.  
  199. results = st.ttest_ind(data5['duration'], data6['duration'], alternative = 'greater')
  200. print('p-значение:', results.pvalue)
  201. if results.pvalue < alpha:
  202.     print('Отвергаем нулевую гипотезу')
  203. else:
  204.     print('Не получилось отвергнуть нулевую гипотезу')
  205.  
  206. print()    
  207. print('Средняя продолжительность аренды у пользователей с подпиской:',
  208.       round(data5['duration'].mean(), 2), 'минут, а у пользователей без подписки',
  209.       round(data6['duration'].mean(), 2), 'минут')
  210. print()
  211. print('В среднем пользователи с подпиской арендуют самокат на',
  212.       round(round(data5['duration'].mean(), 2) - round(data6['duration'].mean(), 2), 2),
  213.       'минут больше, чем пользователи без подписки')
  214.  
  215.  
  216.  
  217.  
  218. optimal_distance = 3130
  219.  
  220. alpha = 0.05
  221.  
  222. results = st.ttest_1samp(
  223.     data5['distance'],
  224.     optimal_distance,
  225.     alternative='less')
  226.  
  227. print('p-значение:', results.pvalue)
  228.  
  229. if (results.pvalue < alpha):
  230.     print('Отвергаем нулевую гипотезу')
  231. else:
  232.     print('Не отвергаем нулевую гипотезу')
  233.    
  234. print()
  235. print('В среднем платные пользователи проезжают', round(data5['distance'].mean(),2), 'метров')
  236.  
  237.  
  238.  
  239.  
  240.  
  241. ultra = data4_pivot.query('subscription_type == "ultra"')
  242. free = data4_pivot.query('subscription_type == "free"')
  243. alpha = 0.05
  244. results = st.ttest_ind(ultra['money'],free['money'], equal_var=False, alternative = 'greater')
  245. print('p-значение:', results.pvalue)
  246.  
  247. if results.pvalue < alpha:
  248.     print('Отвергаем нулевую гипотезу')
  249. else:
  250.     print('Не получилось отвергнуть нулевую гипотезу')
  251. print()
  252. print('В среднем в месяц пользователи с подпиской тратят на аренду самокатов',
  253.       round(ultra['money'].mean(), 2), 'руб',
  254.       ', а пользователи без подписки', round(free['money'].mean(), 2), 'руб')
  255. print()
  256.  
  257. print('В среднем пользователи с подпиской приносят компании на',
  258.       round(round(ultra['money'].mean(), 2) - round(free['money'].mean(),2),2),
  259.       'руб больше, чем пользователи без платной подписки')
  260.  
  261.  
  262.  
  263.  
  264.  
  265. Задача 6.4. Комментарий:</b>
  266. <br> Для решения подобной задачи подойдет проверка гипотезы о равенстве средних для зависимых (парных) выборок, поскольку исходный датафрейм (генеральная совокупность) не изменился количественно (количество пользователей осталось прежним), но изменился качественно (появились данные о количестве обращений до и после обновления).
  267. Решить такую задачу можно методом scipy.stats.ttest_rel()
  268. </div>
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  

Reply to "Untitled"

Here you can reply to the paste above